采用Kruskal算法求最小生成树python
时间: 2025-02-13 09:25:18 浏览: 36
### 使用Python实现Kruskal算法求解最小生成树
为了通过 Python 实现 Kruskal 算法来寻找图中的最小生成树,可以采用如下方法:
定义类 `Graph` 来表示无向加权图并初始化节点数量以及边列表。每条边由起点、终点及其权重组成。
```python
class Graph:
def __init__(self, vertices):
self.V = vertices # 节点数目
self.graph = [] # 存储所有的边 (u,v,w),其中 u 和 v 是顶点而 w 表示它们之间的距离
def addEdge(self, u, v, w):
self.graph.append([u, v, w])
```
接着,在该类内部加入用于执行 Kruskal 的函数 `_find()` 查找集合代表元素;`_union()` 合并两个子集;最后是核心部分——`kruskalMST()`, 它负责按照权重升序排列所有边,并逐一尝试将其添加到正在构建的结果集中直到形成一棵完整的树[^1]。
```python
def _find(self, parent, i):
if parent[i] == i:
return i
return _find(parent, parent[i])
def _union(self, parent, rank, x, y):
rootX = _find(parent, x)
rootY = _find(parent, y)
if rank[rootX] < rank[rootY]:
parent[rootX] = rootY
elif rank[rootX] > rank[rootY]:
parent[rootY] = rootX
else :
parent[rootY] = rootX
rank[rootX] += 1
def kruskalMST(graph):
result = []
graph.graph = sorted(graph.graph,key=lambda item:item[2])
parent ,rank= [],[]
for node in range(graph.V):
parent.append(node)
rank.append(0)
edges,i,e = graph.graph,0,0
while e<graph.V-1 :
u,v,w =edges[i]
i+=1
x=_find(parent,u)
y=_find(parent,v)
if x!=y:
e=e+1
result.append([u,v,w])
union(parent,rank,x,y)
minimumCost = 0
print ("Edges in the constructed MST")
for u, v, weight in result:
minimumCost += weight
print("%d -- %d == %d" % (u, v, weight))
print("Minimum Spanning Tree",minimumCost)
```
上述代码实现了基于贪心策略的 Kruskal 算法,能够有效地找到给定连通带权无向图的一棵最小生成树[^1]。
阅读全文
相关推荐


















