最小生成树 计算带权无向连通图G的最小生成树。输入格式: 第一行两个整数:N(1≤N<300000),表示结点集{1,2,3N};M(0 ≤ M≤600000)表示边的条数。 接下来M行,每行表示一条带权的边,用3个整数uvc表示,分别表示一条边的两个端点以及其权值(权值范围0<c<10°)输出格式: 一个整数,表示G的最小生成树的边权之和。 【样例输入】 5101231371491552362482 5434 93 57452 【样例输出】 15
时间: 2024-02-18 19:05:35 浏览: 168
这是一个经典的最小生成树问题,可以使用Kruskal或Prim算法求解。下面是Kruskal算法的实现:
```python
# 定义边的结构体
class Edge:
def __init__(self, u, v, w):
self.u, self.v, self.w = u, v, w
# 并查集
class UnionFind:
def __init__(self, n):
self.parent = list(range(n))
self.size = [1] * 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.size[px] < self.size[py]:
px, py = py, px
self.parent[py] = px
self.size[px] += self.size[py]
return True
# Kruskal算法
def kruskal(n, edges):
uf = UnionFind(n)
edges.sort(key=lambda e: e.w)
res = 0
for e in edges:
if uf.union(e.u, e.v):
res += e.w
return res
# 读入数据
n, m = map(int, input().split())
edges = []
for i in range(m):
u, v, w = map(int, input().split())
edges.append(Edge(u-1, v-1, w))
# 求解最小生成树
print(kruskal(n, edges))
```
其中,Kruskal算法主要包含两个部分:边的排序和并查集的维护。边的排序可以使用Python内置的`sort`函数,也可以使用`heapq`模块实现。并查集的维护包括`find`和`union`操作,其中`find`操作采用路径压缩优化,`union`操作采用按秩合并优化。
阅读全文
相关推荐


















