class UnionFind:
def __init__(self,n):
self.parent=list(range(n))
self.rank=[0]*n
def find(self,x):
if self.parent[x]!=x:
self.parent[x]=self.find(self.parent[x])
return self.parent[x]
def union(self,x,y):
root_x=self.find(x)
root_y=self.find(y)
if root_x != root_y:
if self.rank[root_x]>self.rank[root_y]:
self.parent[root_y]=root_x
elif self.rank[root_x]<self.rank[root_y]:
self.parent[root_x]=root_y
else:
self.parent[root_y]=root_x
self.rank[root_x]+=1
def kruskal(vertices,edges):
edges.sort(key=lambda x:x[2])
uf=UnionFind(len(vertices))
mst=[]
for u,v,weight in edges:
if uf.find(u) != uf.find(v):
uf.union(u,v)
mst.append((u,v,weight))
return mst
vertices = [0,1,2,3]
edges=[
(0,1,1),
(0,2,3),
(1,2,2),
(1,3,4),
(2,3,5)
]
mst=kruskal(vertices,edges)
print('最小生成树',mst)