用Python利用并查集的思想求解最小生成树的问题。输入格式: n, e :n端点数量、m边的数量 n1,n2,e1:1端点1,n2端点2 e1边的权值 这样的信息有e行 输出格式: n1 n2 e1 生成树中的边的信息生成树的权值之和即最小成本。
时间: 2024-02-20 18:00:11 浏览: 55
好的,这是一个经典的最小生成树问题,我们可以使用 Kruskal 算法来解决。下面是代码实现:
```python
class UnionFind:
def __init__(self, n):
self.parent = list(range(n))
self.size = [1] * n
def find(self, x):
while x != self.parent[x]:
self.parent[x] = self.parent[self.parent[x]]
x = self.parent[x]
return x
def union(self, x, y):
px, py = self.find(x), self.find(y)
if px != py:
if self.size[px] > self.size[py]:
px, py = py, px
self.parent[px] = py
self.size[py] += self.size[px]
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.find(u) != uf.find(v):
uf.union(u, v)
res.append((u, v, w))
cost += w
return res, 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))
res, cost = kruskal(n, edges)
for u, v, w in res:
print(u+1, v+1, w)
print(cost)
```
代码解释:
- `UnionFind` 类实现了并查集数据结构,包括 `find` 和 `union` 两个操作。
- `kruskal` 函数接受节点数量 `n` 和边列表 `edges`,其中每条边由 `(u, v, w)` 表示,表示边的两个端点为 `u` 和 `v`,边权为 `w`。
- 算法首先对边按照权值进行排序。
- 然后依次遍历每条边,如果边的两个端点不在同一个连通块中,则将它们合并,并将这条边加入生成树中。
- 最后返回生成树的边列表和总权值。
在输入格式中,我们将节点编号从 1 开始,但是在代码中我们将其统一减 1,从 0 开始编号。输出时再将编号加 1 即可。
阅读全文