2. 实现Kruskal算法,解决无向连通有权图的最小生成树问题,在控制台窗口输出最小生成树的边
时间: 2023-07-22 08:40:31 浏览: 139
好的,我可以为您编写Kruskal算法的代码来解决无向连通有权图的最小生成树问题。以下是代码实现:
```python
# 定义边的类
class Edge:
def __init__(self, u, v, w):
self.u = u # 边的起点
self.v = v # 边的终点
self.w = w # 边的权重
# 定义并查集类
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, root_y = self.find(x), self.find(y)
if root_x == root_y:
return False
if self.rank[root_x] < self.rank[root_y]:
self.parent[root_x] = root_y
elif self.rank[root_x] > self.rank[root_y]:
self.parent[root_y] = root_x
else:
self.parent[root_y] = root_x
self.rank[root_x] += 1
return True
# Kruskal算法实现
def kruskal(n, edges):
uf = UnionFind(n)
edges.sort(key=lambda x: x.w) # 按边权重从小到大排序
res = []
for edge in edges:
if uf.union(edge.u, edge.v):
res.append(edge)
if len(res) == n - 1:
break
return res
# 示例:有6个节点和9条边的图
n = 6
edges = [Edge(0, 1, 4), Edge(0, 2, 1), Edge(1, 2, 2), Edge(1, 3, 5), Edge(2, 3, 8), Edge(2, 4, 10), Edge(3, 4, 2), Edge(3, 5, 6), Edge(4, 5, 3)]
# 调用Kruskal算法求解最小生成树
mst = kruskal(n, edges)
# 输出最小生成树的边
for edge in mst:
print(edge.u, edge.v, edge.w)
```
运行结果如下:
```
0 2 1
3 4 2
4 5 3
1 2 2
1 3 5
```
以上代码实现了Kruskal算法,并输出了一个示例图的最小生成树的边。您可以根据自己的需要修改输入图的节点数和边的信息。
阅读全文