Add Prim's MST algorithm
parent
7dae2295ac
commit
5739c3e985
|
@ -0,0 +1,96 @@
|
|||
# A Python implementation of
|
||||
# Prim's Minimum Spanning Tree (MST) algorithm.
|
||||
# The program is for an adjacency matrix
|
||||
# representation of the graph. Time
|
||||
# Time complexity is O(V^2). If the input
|
||||
# graph is represented as an adjacency list
|
||||
# rather than a matrix, time complexity
|
||||
# can be reduced O(E * logV) with the help of
|
||||
# a binary heap. Space complexity: O(V).
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
class Graph():
|
||||
def __init__(self, vertices):
|
||||
self.V = vertices
|
||||
self.graph = [[0 for column in range(vertices)]
|
||||
for row in range(vertices)]
|
||||
|
||||
# A utility function to print
|
||||
# the constructed MST stored in parent[]
|
||||
def printMST(self, parent):
|
||||
print("Edge \tWeight")
|
||||
for i in range(1, self.V):
|
||||
print(parent[i], "-", i, "\t", self.graph[i][parent[i]])
|
||||
|
||||
# A utility function to find the vertex with
|
||||
# minimum distance value, from the set of vertices
|
||||
# not yet included in shortest path tree
|
||||
def minKey(self, key, mstSet):
|
||||
|
||||
# Initialize min value
|
||||
min = sys.maxsize
|
||||
|
||||
for v in range(self.V):
|
||||
if key[v] < min and mstSet[v] == False:
|
||||
min = key[v]
|
||||
min_index = v
|
||||
|
||||
return min_index
|
||||
|
||||
# Function to construct and print MST for a graph
|
||||
# represented using adjacency matrix representation
|
||||
def primMST(self):
|
||||
|
||||
# Key values used to pick minimum weight edge in cut
|
||||
key = [sys.maxsize] * self.V
|
||||
parent = [None] * self.V # Array to store constructed MST
|
||||
# Make key 0 so that this vertex is picked as first vertex
|
||||
key[0] = 0
|
||||
mstSet = [False] * self.V
|
||||
|
||||
parent[0] = -1 # First node is always the root of
|
||||
|
||||
for cout in range(self.V):
|
||||
|
||||
# Pick the minimum distance vertex from
|
||||
# the set of vertices not yet processed.
|
||||
# u is always equal to src in first iteration
|
||||
u = self.minKey(key, mstSet)
|
||||
|
||||
# Put the minimum distance vertex in
|
||||
# the shortest path tree
|
||||
mstSet[u] = True
|
||||
|
||||
# Update dist value of the adjacent vertices
|
||||
# of the picked vertex only if the current
|
||||
# distance is greater than new distance and
|
||||
# the vertex in not in the shortest path tree
|
||||
for v in range(self.V):
|
||||
|
||||
# graph[u][v] is non zero only for adjacent vertices of m
|
||||
# mstSet[v] is false for vertices not yet included in MST
|
||||
# Update the key only if graph[u][v] is smaller than key[v]
|
||||
if self.graph[u][v] > 0 and mstSet[v] == False \
|
||||
and key[v] > self.graph[u][v]:
|
||||
key[v] = self.graph[u][v]
|
||||
parent[v] = u
|
||||
|
||||
self.printMST(parent)
|
||||
|
||||
|
||||
# Driver's code
|
||||
if __name__ == '__main__':
|
||||
g = Graph(5)
|
||||
g.graph = [[0, 2, 0, 6, 0],
|
||||
[2, 0, 3, 8, 5],
|
||||
[0, 3, 0, 0, 7],
|
||||
[6, 8, 0, 0, 9],
|
||||
[0, 5, 7, 9, 0]]
|
||||
|
||||
g.primMST()
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue