编写程序,用Kruskal算法计算出无向图的最小生成树。输入:无输出:生成树的每条边及生成树的权值之和
时间: 2023-07-22 09:29:16 浏览: 72
好的,我可以帮你编写这个程序。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 x != self.parent[x]:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def union(self, x, y):
px, py = self.find(x), self.find(y)
if px == py:
return False
if self.rank[px] < self.rank[py]:
self.parent[px] = py
elif self.rank[px] > self.rank[py]:
self.parent[py] = px
else:
self.parent[px] = py
self.rank[py] += 1
return True
# Kruskal算法求解最小生成树
def kruskal(edges, n):
# 将边按权重从小到大排序
edges.sort(key=lambda e: e.w)
uf = UnionFind(n)
res = []
for e in edges:
if uf.union(e.u, e.v):
res.append(e)
return res
# 测试
if __name__ == '__main__':
# 无向图的边集
edges = [
Edge(0, 1, 4), Edge(0, 7, 8), Edge(1, 2, 8),
Edge(1, 7, 11), Edge(2, 3, 7), Edge(2, 8, 2),
Edge(2, 5, 4), Edge(3, 4, 9), Edge(3, 5, 14),
Edge(4, 5, 10), Edge(5, 6, 2), Edge(6, 7, 1),
Edge(6, 8, 6), Edge(7, 8, 7)
]
n = 9
res = kruskal(edges, n)
# 输出生成树的每条边及生成树的权值之和
for e in res:
print('(%d, %d, %d)' % (e.u, e.v, e.w))
print(sum(e.w for e in res))
```
程序的输出结果为:
```
(6, 7, 1)
(2, 8, 2)
(5, 6, 2)
(0, 1, 4)
(2, 5, 4)
(2, 3, 7)
(0, 7, 8)
(3, 4, 9)
37
```
其中,生成树的每条边分别为 `(6, 7, 1)`、`(2, 8, 2)`、`(5, 6, 2)`、`(0, 1, 4)`、`(2, 5, 4)`、`(2, 3, 7)`、`(0, 7, 8)`、`(3, 4, 9)`,生成树的权值之和为 37。
阅读全文