class unionfind:
def __init__(self,n):
self.parent=list(range(n))
self.rank=[0]*n
def find(self,u):
#如果父节点不是自己的话,采用路径压缩
if self.parent[u]!=u:
self.parent[u]=self.find(self.parent[u])
return self.parent[u]
def uion(self,u,v):
root_u=self.find(u)
root_v=self.find(v)
if root_u !=root_v:
if self.rank[root_u]>self.rank[root_v]:
self.parent[root_v]=root_u
elif self.rank[root_u]<self.rank[root_v]:
self.parent[root_u]=root_v
else:
self.parent[root_v]=root_u
self.rank[root_u]+=1
def kruskal(n, edges):
uf=unionfind(n)
edges.sort()
mst_route=[]#保存访问路径
tw=0
for weight,u,v,in edges:
"""
判断环的形成:
如果 find(u) 和 find(v) 返回的根节点相同,说明节点 u 和 v 已经在同一个集合中,加入这条边会形成环。
如果 find(u) 和 find(v) 返回的根节点不同,说明节点 u 和 v 分属不同集合,加入这条边不会形成环。
"""
if uf.find(u)!=uf.find(v):
uf.uion(u,v)
mst_route.append((u,v,weight))
tw+=weight
return mst_route,tw
if __name__=="__main__":
edges = [
(10, 0, 1),
(6, 0, 2),
(5, 1, 2),
(15, 1, 3),
(4, 2, 3)]
n = 4
mst,tw=kruskal(n,edges)
print("最小生成树结果:", mst)
print("最小权重值结果:", tw)
最小生成树的Kruskal算法实现
最新推荐文章于 2024-08-14 17:18:35 发布