class UnionFind:
def __init__(self, n):
self.parent = list(range(n))
self.rank = [0] * n
def find(self, x):
while self.parent[x] != x:
self.parent[x] = self.parent[self.parent[x]]
x = self.parent[x]
return x
def union(self, x, y):
rootX = self.find(x)
rootY = self.find(y)
if rootX == rootY:
return False
if self.rank[rootX] < self.rank[rootY]:
self.parent[rootX] = rootY
elif self.rank[rootX] > self.rank[rootY]:
self.parent[rootY] = rootX
else:
self.parent[rootY] = rootX
self.rank[rootX] += 1
return True
def kruskal(n, edges):
uf = UnionFind(n)
mst = []
edges.sort(key=lambda x: x[2]) # sort by weight
for u, v, w in edges:
if uf.union(u, v):
mst.append((u, v, w))
return mst
# Example graph with 5 vertices (0 to 4)
edges = [
(0, 1, 1),
(1, 2, 2),
(0, 2, 3),
(2, 3, 4),
(3, 4, 5)
]
result = kruskal(5, edges)
for edge in result:
print(edge)