python
def kruskal(vertices, edges):
parent = {v: v for v in vertices}
size = {v: 1 for v in vertices}
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
def union(a, b):
ra = find(a)
rb = find(b)
if ra == rb:
return False
if size[ra] < size[rb]:
ra, rb = rb, ra
parent[rb] = ra
size[ra] += size[rb]
return True
mst = []
total = 0
for a, b, weight in sorted(
edges, key=lambda e: e[2]
):
if union(a, b):
mst.append((a, b, weight))
total += weight
if len(mst) == len(vertices) - 1:
break
return mst, total