用Python写一个程序,利用并查集的思想求解最小生成树的问题。输入格式: n, e :n端点数量、m边的数量 n1,n2,e1:1端点1,n2端点2 e1边的权值 这样的信息有e行 输出格式: n1 n2 e1 生成树中的边的信息生成树的权值之和即最小成本。
时间: 2024-02-05 19:13:11 浏览: 65
求最小费用或最短路径(最小生成树)
以下是基于并查集的最小生成树算法的 Python 代码实现:
```python
class UnionFind:
def __init__(self, n):
self.parent = list(range(n))
self.rank = [0] * n
def find(self, i):
if self.parent[i] != i:
self.parent[i] = self.find(self.parent[i])
return self.parent[i]
def union(self, i, j):
pi, pj = self.find(i), self.find(j)
if pi == pj:
return False
if self.rank[pi] < self.rank[pj]:
pi, pj = pj, pi
self.parent[pj] = pi
if self.rank[pi] == self.rank[pj]:
self.rank[pi] += 1
return True
def kruskal_algorithm(n, edges):
uf = UnionFind(n)
edges.sort(key=lambda x: x[2])
result = []
cost = 0
for u, v, w in edges:
if uf.union(u, v):
result.append((u, v))
cost += w
return result, cost
n, e = map(int, input().split())
edges = []
for i in range(e):
u, v, w = map(int, input().split())
edges.append((u-1, v-1, w))
result, cost = kruskal_algorithm(n, edges)
print("生成树中的边的信息:")
for u, v in result:
print(u+1, v+1)
print("生成树的权值之和:", cost)
```
在这个实现中,我们首先定义了一个 `UnionFind` 类,该类维护了每个节点的父节点和秩(rank),以及 `find` 和 `union` 方法,分别用于查找节点所属的集合和合并两个集合。然后我们使用 Kruskal 算法,将边按照权值从小到大排序,然后依次将边加入生成树中,直到所有节点都在同一个集合中为止。最后输出生成树中的边的信息和生成树的权值之和即可。
输入样例:
```
5 7
1 2 2
1 3 3
2 3 1
2 4 4
2 5 3
3 5 2
4 5 1
```
输出样例:
```
生成树中的边的信息:
4 5
3 5
1 2
2 3
生成树的权值之和: 10
```
阅读全文