From f34b23cb4741757614764b14882081efb5f7b2bc Mon Sep 17 00:00:00 2001 From: ManDeep Singh Date: Thu, 1 Oct 2020 01:07:46 +0530 Subject: [PATCH] Added Kruskal's Algorithm --- Kruskal's_Algorithm.py | 69 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 Kruskal's_Algorithm.py diff --git a/Kruskal's_Algorithm.py b/Kruskal's_Algorithm.py new file mode 100644 index 0000000..8199e33 --- /dev/null +++ b/Kruskal's_Algorithm.py @@ -0,0 +1,69 @@ +# Kruskal's algorithm in Python + + +class Graph: + def __init__(self, vertices): + self.V = vertices + self.graph = [] + + def add_edge(self, u, v, w): + self.graph.append([u, v, w]) + + # Search function + + def find(self, parent, i): + if parent[i] == i: + return i + return self.find(parent, parent[i]) + + def apply_union(self, parent, rank, x, y): + xroot = self.find(parent, x) + yroot = self.find(parent, y) + if rank[xroot] < rank[yroot]: + parent[xroot] = yroot + elif rank[xroot] > rank[yroot]: + parent[yroot] = xroot + else: + parent[yroot] = xroot + rank[xroot] += 1 + + # Applying Kruskal algorithm + def kruskal_algo(self): + result = [] + i, e = 0, 0 + self.graph = sorted(self.graph, key=lambda item: item[2]) + parent = [] + rank = [] + for node in range(self.V): + parent.append(node) + rank.append(0) + while e < self.V - 1: + u, v, w = self.graph[i] + i = i + 1 + x = self.find(parent, u) + y = self.find(parent, v) + if x != y: + e = e + 1 + result.append([u, v, w]) + self.apply_union(parent, rank, x, y) + for u, v, weight in result: + print("%d - %d: %d" % (u, v, weight)) + + +g = Graph(6) +g.add_edge(0, 1, 4) +g.add_edge(0, 2, 4) +g.add_edge(1, 2, 2) +g.add_edge(1, 0, 4) +g.add_edge(2, 0, 4) +g.add_edge(2, 1, 2) +g.add_edge(2, 3, 3) +g.add_edge(2, 5, 2) +g.add_edge(2, 4, 4) +g.add_edge(3, 2, 3) +g.add_edge(3, 4, 3) +g.add_edge(4, 2, 4) +g.add_edge(4, 3, 3) +g.add_edge(5, 2, 2) +g.add_edge(5, 4, 3) +g.kruskal_algo() \ No newline at end of file