Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Python技术 >

Python采用Kruskal(克鲁斯卡尔)算法实现最小生成树 PDF 下载


分享到:
时间:2024-05-29 10:47来源:http://www.java1234.com 作者:转载  侵权举报
Python采用Kruskal(克鲁斯卡尔)算法实现最小生成树
失效链接处理
Python采用Kruskal(克鲁斯卡尔)算法实现最小生成树 PDF 下载
 
 
 
 
相关截图:
 
主要内容:

最小生成树(Minimum Spanning Tree, MST)
最小生成树是一个无向加权连通图的子集,它连接了图中的所有顶点(节点),并且没有循环(回路),同
时所有边的权重之和是最小的。在计算机网络、电路设计、物流运输等领域有着广泛的应用。
Kruskal算法实现原理和步骤
1. 将图中的所有边按照权重从小到大排序。
2. 从权重最小的边开始,如果这条边连接的两个顶点不属于同一个集合(通过并查集来判断),则将其加
入最小生成树,并合并这两个顶点的集合。
3. 重复步骤2,直到选择的边的数量等于图中的顶点数减一。
Python实现

 

class UnionFind:
def __init__(self, vertices):
self.parent = {v: v for v in range(vertices)}
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):
rootX = self.find(x)
rootY = self.find(y)
if rootX != rootY:
self.parent[rootX] = rootY
class Graph:
def __init__(self, vertices):
self.V = vertices
self.edges = []
def add_edge(self, u, v, w):
self.edges.append([u, v, w])
def kruskal_mst(self):
result = []
i, e = 0, 0
# 按照权重排序所有的边
self.edges.sort(key=lambda item: item[2])
uf = UnionFind(self.V)
while e < self.V - 1:
u, v, w = self.edges[i]
i += 1
x = uf.find(u)
y = uf.find(v)
# 如果边的两个顶点不属于同一个集合(即没有形成环)
if x != y:
e += 1
result.append([u, v, w])
uf.union(x, y)
return result
# 示例
g = Graph(4)
g.add_edge(0, 1, 10)
g.add_edge(0, 2, 6)
g.add_edge(0, 3, 5)
g.add_edge(1, 3, 15)
g.add_edge(2, 3, 4)
result = g.kruskal_mst()
print("Edges in the constructed MST")
for u, v, weight in result:
print(f"{u} -- {v} == {weight}")



 


------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐