| 
 | 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