Skip to content

Commit a015447

Browse files
Merge pull request #233 from tanishkapall/kruskals
Create kruskals.py
2 parents 732e4b1 + 4f2d765 commit a015447

1 file changed

Lines changed: 68 additions & 0 deletions

File tree

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
class DisjointSet:
2+
def __init__(self, n):
3+
self.parent = list(range(n))
4+
self.rank = [0] * n
5+
6+
def find(self, u):
7+
if self.parent[u] != u:
8+
self.parent[u] = self.find(self.parent[u]) # Path compression
9+
return self.parent[u]
10+
11+
def union(self, u, v):
12+
rootU = self.find(u)
13+
rootV = self.find(v)
14+
if rootU != rootV:
15+
if self.rank[rootU] < self.rank[rootV]:
16+
self.parent[rootU] = rootV
17+
elif self.rank[rootU] > self.rank[rootV]:
18+
self.parent[rootV] = rootU
19+
else:
20+
self.parent[rootV] = rootU
21+
self.rank[rootU] += 1
22+
return True
23+
return False
24+
25+
class Graph:
26+
def __init__(self, vertices):
27+
self.V = vertices
28+
self.edges = [] # Each edge: (weight, u, v)
29+
30+
def add_edge(self, u, v, w):
31+
self.edges.append((w, u, v))
32+
33+
def kruskal(self):
34+
self.edges.sort()
35+
ds = DisjointSet(self.V)
36+
mst = []
37+
total_weight = 0
38+
39+
for w, u, v in self.edges:
40+
if ds.union(u, v): # If no cycle formed
41+
mst.append((u, v, w))
42+
total_weight += w
43+
44+
print("Edges in the MST:")
45+
for u, v, w in mst:
46+
print(f"{u} -- {v} == {w}")
47+
print("Total weight of MST:", total_weight)
48+
49+
# Example usage:
50+
if __name__ == "__main__":
51+
g = Graph(6)
52+
g.add_edge(0, 1, 4)
53+
g.add_edge(0, 2, 4)
54+
g.add_edge(1, 2, 2)
55+
g.add_edge(1, 0, 4)
56+
g.add_edge(2, 0, 4)
57+
g.add_edge(2, 1, 2)
58+
g.add_edge(2, 3, 3)
59+
g.add_edge(2, 5, 2)
60+
g.add_edge(2, 4, 4)
61+
g.add_edge(3, 2, 3)
62+
g.add_edge(3, 4, 3)
63+
g.add_edge(4, 2, 4)
64+
g.add_edge(4, 3, 3)
65+
g.add_edge(5, 2, 2)
66+
g.add_edge(5, 4, 3)
67+
68+
g.kruskal()

0 commit comments

Comments
 (0)