Python写代码:使用并查集的思想求解最小生成树问题 输入格式: n,e ;n端点数量、m边的数量 n1,n2,e1 ; n1端点1,n2端点2 e1边的权值 。。。 ;这样的信息有e行 输出格式: n1 n2 e1 生成树中的边的信息 生成树的权值之和即最小成本
时间: 2024-02-27 11:51:43 浏览: 146
最小生成树的 Python 代码
好的,这是一个比较经典的最小生成树问题,可以使用Kruskal算法或Prim算法进行求解。这里我给出Kruskal算法的代码:
首先定义一个并查集类:
```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]:
self.parent[pi] = pj
elif self.rank[pi] > self.rank[pj]:
self.parent[pj] = pi
else:
self.parent[pi] = pj
self.rank[pj] += 1
return True
```
然后定义Kruskal算法:
```python
def kruskal(n, edges):
uf = UnionFind(n)
edges.sort(key=lambda x: x[2])
mst = []
mst_weight = 0
for u, v, w in edges:
if uf.union(u, v):
mst.append((u, v, w))
mst_weight += w
if len(mst) == n - 1:
break
return mst, mst_weight
```
最后读入数据,调用Kruskal算法求解,输出结果即可:
```python
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))
mst, mst_weight = kruskal(n, edges)
print(mst_weight)
for u, v, w in mst:
print(u+1, v+1, w)
```
其中,mst表示最小生成树中的边的信息,mst_weight表示最小生成树的权值之和。
阅读全文