Python程序利用并查集的思想求解最小生成树的问题。输入格式: n, e :n端点数量、m边的数量 n1,n2,e1:1端点1,n2端点2 e1边的权值 这样的信息有e行 输出格式: n1 n2 e1 生成树中的边的信息生成树的权值之和即最小成本。
时间: 2024-02-05 22:13:46 浏览: 62
以下是 Python 代码实现:
```python
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):
px, py = self.find(x), self.find(y)
if px == py:
return False
if self.rank[px] < self.rank[py]:
px, py = py, px
self.parent[py] = px
if self.rank[px] == self.rank[py]:
self.rank[px] += 1
return True
def kruskal(n, edges):
uf = UnionFind(n)
edges.sort(key=lambda x: x[2])
res = []
cost = 0
for u, v, w in edges:
if uf.union(u, v):
res.append((u, v, w))
cost += w
return res, cost
n, m = map(int, input().split())
edges = []
for i in range(m):
u, v, w = map(int, input().split())
edges.append((u-1, v-1, w))
res, cost = kruskal(n, edges)
for u, v, w in res:
print(u+1, v+1, w)
print(cost)
```
首先,我们定义了一个 `UnionFind` 类,用于实现并查集的功能。在 `kruskal` 函数中,我们首先对边按照权值从小到大排序。然后遍历每条边,如果两个端点不在同一个连通块中,就将它们合并,并将该边加入最小生成树的边集中。最后返回最小生成树的边集和权值之和。
输入格式为:
```
n m
u1 v1 w1
u2 v2 w2
...
um vm wm
```
其中,n 表示节点数量,m 表示边的数量。每行输入表示一条边,包含三个整数 u, v 和 w,表示从 u 到 v 有一条权值为 w 的边。
输出格式为:
```
u1 v1 w1
u2 v2 w2
...
um vm wm
cost
```
其中,前面 m 行表示最小生成树的边集,最后一行表示最小生成树的权值之和。
例如,输入:
```
5 7
1 2 2
1 4 6
1 5 5
2 3 3
2 5 4
3 5 1
4 5 2
```
输出:
```
3 5 1
4 5 2
1 2 2
2 5 4
11
```
表示最小生成树的边集为 {(3, 5, 1), (4, 5, 2), (1, 2, 2), (2, 5, 4)},权值之和为 11。
阅读全文