From a929a20f39ce736f51a74dd51d5f4e7668191fbc Mon Sep 17 00:00:00 2001 From: Dharaneedharan Date: Fri, 22 Oct 2021 12:09:08 +0530 Subject: [PATCH 1/3] Add Prim's algorithm for minimum spanning tree --- src/main/python/algorithms/graph/prim_mst.py | 60 ++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/python/algorithms/graph/prim_mst.py diff --git a/src/main/python/algorithms/graph/prim_mst.py b/src/main/python/algorithms/graph/prim_mst.py new file mode 100644 index 0000000..b02e72b --- /dev/null +++ b/src/main/python/algorithms/graph/prim_mst.py @@ -0,0 +1,60 @@ +# A Python program for Prim's Minimum Spanning Tree (MST) algorithm. +# The program is for adjacency matrix representation of the graph + +class Graph: + def __init__(self, vertices): + self.V = vertices + self.graph = [[0 for column in range(vertices)] for row in range(vertices)] + + def printMST(self, parent): + print("Edge \tWeight") + for i in range(1, self.V): + print(parent[i], "-", i, "\t", self.graph[i][parent[i]]) + + def minKey(self, key, mstSet): + + # Initilaize min value + min = 1000000 + + for v in range(self.V): + if key[v] < min and mstSet[v] == False: + min = key[v] + min_index = v + + return min_index + + def primMST(self): + + # Key values used to pick minimum weight edge in cut + key = [1000000] * self.V + parent = [None] * self.V # Array to store constructed MST + key[0] = 0 # Make key 0 so that this vertex is picked as first vertex + 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 shotest 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) \ No newline at end of file From 4bf2f0ce8bbc42a3e43ba8f2f57fe199dc3ee0ff Mon Sep 17 00:00:00 2001 From: Dharaneedharan Date: Fri, 22 Oct 2021 12:22:50 +0530 Subject: [PATCH 2/3] Add driver code and test with input --- src/main/python/algorithms/graph/prim_mst.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/python/algorithms/graph/prim_mst.py b/src/main/python/algorithms/graph/prim_mst.py index b02e72b..1526990 100644 --- a/src/main/python/algorithms/graph/prim_mst.py +++ b/src/main/python/algorithms/graph/prim_mst.py @@ -57,4 +57,16 @@ def primMST(self): key[v] = self.graph[u][v] parent[v] = u - self.printMST(parent) \ No newline at end of file + self.printMST(parent) + +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() \ No newline at end of file From 101e1daaeb1b331ddbb126daceae6847b4fb22f5 Mon Sep 17 00:00:00 2001 From: Dharaneedharan Date: Fri, 22 Oct 2021 19:15:20 +0530 Subject: [PATCH 3/3] Add comments for functions --- src/main/python/algorithms/graph/prim_mst.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/python/algorithms/graph/prim_mst.py b/src/main/python/algorithms/graph/prim_mst.py index 1526990..0db31df 100644 --- a/src/main/python/algorithms/graph/prim_mst.py +++ b/src/main/python/algorithms/graph/prim_mst.py @@ -6,11 +6,14 @@ def __init__(self, vertices): self.V = vertices self.graph = [[0 for column in range(vertices)] for row in range(vertices)] - def printMST(self, parent): + # 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]]) + # 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): # Initilaize min value @@ -23,6 +26,8 @@ def minKey(self, key, mstSet): 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 @@ -31,7 +36,7 @@ def primMST(self): key[0] = 0 # Make key 0 so that this vertex is picked as first vertex mstSet = [False] * self.V - parent[0] = -1 # First node is always the root of + parent[0] = -1 # First node is always the root for cout in range(self.V):