|
| 1 | +# Author: OMKAR PATHAK |
| 2 | + |
| 3 | +# Algorithm: |
| 4 | +# 1) Create a set mstSet that keeps track of vertices already included in MST. |
| 5 | +# 2) Assign a key value to all vertices in the input graph. Initialize all key values as INFINITE. |
| 6 | +# Assign key value as 0 for the first vertex so that it is picked first. |
| 7 | +# 3) While mstSet doesn’t include all vertices |
| 8 | +# a) Pick a vertex u which is not there in mstSet and has minimum key value. |
| 9 | +# b) Include u to mstSet. |
| 10 | +# c) Update key value of all adjacent vertices of u. To update the key values, iterate through all adjacent |
| 11 | +# vertices. For every adjacent vertex v, if weight of edge u-v is less than the previous key value of v, |
| 12 | +# update the key value as weight of u-v |
| 13 | + |
| 14 | +# Properties of Prim's Algorithm: |
| 15 | +# 1) The edges in the subset of some minimum spanning tree always form a single tree. |
| 16 | +# 2) It grows the tree until it spans all the vertices of the graph. |
| 17 | +# 3) An edge is added to the tree, at every step, that crosses a cut if its weight is the minimum of any edge |
| 18 | +# crossing the cut, connecting it to a vertex of the graph. |
| 19 | + |
| 20 | +import sys |
| 21 | + |
| 22 | +class Graph(object): |
| 23 | + def __init__(self, vertices): |
| 24 | + self.vertices = vertices # Total number of Vertices in the graph |
| 25 | + self.graph = [[0 for column in range(vertices)] |
| 26 | + for row in range(vertices)] # Initialize the adjacency matrix with zeros |
| 27 | + |
| 28 | + def getMinimumKey(self, weight, visited): |
| 29 | + # initialize the min by infinite number |
| 30 | + min = 9999 |
| 31 | + |
| 32 | + for i in range(self.vertices): |
| 33 | + # Find the edge with minimum weight if it not visited |
| 34 | + if weight[i] < min and visited[i] == False: |
| 35 | + min = weight[i] |
| 36 | + minIndex = i |
| 37 | + |
| 38 | + # Return the index of the found edge with minimum weight |
| 39 | + return minIndex |
| 40 | + |
| 41 | + def primsAlgo(self): |
| 42 | + weight = [9999] * self.vertices # This list will be used for storing the weights of all vertices |
| 43 | + MST = [None] * self.vertices # This will contain our minimum spanning tree |
| 44 | + weight[0] = 0 # Weight of the root node will be 0 |
| 45 | + visited = [False] * self.vertices |
| 46 | + MST[0] = -1 # Choosing first node as root vertex |
| 47 | + |
| 48 | + for _ in range(self.vertices): |
| 49 | + minIndex = self.getMinimumKey(weight, visited) |
| 50 | + # mark the index as visited |
| 51 | + visited[minIndex] = True |
| 52 | + |
| 53 | + for vertex in range(self.vertices): |
| 54 | + if self.graph[minIndex][vertex] > 0 and visited[vertex] == False and \ |
| 55 | + weight[vertex] > self.graph[minIndex][vertex]: |
| 56 | + weight[vertex] = self.graph[minIndex][vertex] |
| 57 | + MST[vertex] = minIndex |
| 58 | + |
| 59 | + self.printMST(MST) |
| 60 | + |
| 61 | + def printMST(self, MST): |
| 62 | + print ("Edge \tWeight") |
| 63 | + for i in range(1, self.vertices): |
| 64 | + print (MST[i],"-",i,"\t",self.graph[i][ MST[i] ]) |
| 65 | + |
| 66 | +if __name__ == '__main__': |
| 67 | + g = Graph(6) |
| 68 | + |
| 69 | + g.graph = [[0, 3, 2, 5, 7, 3], |
| 70 | + [3, 0, 4, 8, 6, 6], |
| 71 | + [2, 4, 0, 7, 1, 3], |
| 72 | + [5, 8, 7, 0, 2, 4], |
| 73 | + [7, 6, 1, 2, 0, 3], |
| 74 | + [3, 6, 3, 4, 3, 0]] |
| 75 | + |
| 76 | + g.primsAlgo() |
0 commit comments