写出最小生成树(克鲁斯卡尔)的模板
时间: 2023-10-30 07:06:16 浏览: 124
```python
# 定义边类
class Edge:
def __init__(self, u, v, w):
self.u = u
self.v = v
self.w = w
# 克鲁斯卡尔算法
def kruskal(n, edges):
edges.sort(key=lambda x: x.w) # 按边权从小到大排序
parent = list(range(n))
rank = [0] * n
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
def union(u, v):
pu, pv = find(u), find(v)
if pu == pv:
return False
if rank[pu] < rank[pv]:
parent[pu] = pv
elif rank[pu] > rank[pv]:
parent[pv] = pu
else:
parent[pv] = pu
rank[pu] += 1
return True
mst = []
for e in edges:
if union(e.u, e.v):
mst.append(e)
return mst
```
其中,n 表示节点个数,edges 是边列表,每个元素是一个 Edge 类的实例,包含三个属性:u,v 和 w,分别表示边的两个端点和边权。返回的是最小生成树的边列表。
阅读全文