克鲁斯卡尔算法实现最小生成树
时间: 2024-01-06 09:25:03 浏览: 90
克鲁斯卡尔算法是一种用于求解连通网的最小生成树的方法。它的时间复杂度为O(eloge),适用于求解边稀疏的网的最小生成树。
实现克鲁斯卡尔算法的思路如下:
1. 将连通网的所有边按照权值从小到大进行排序。
2. 创建一个空的集合,用于存放最小生成树的边。
3. 遍历排序后的边集合,依次将边加入最小生成树的集合中,但要保证加入的边不会导致形成环路。
- 可以使用并查集来判断两个顶点是否属于同一个连通分量,如果不属于同一个连通分量,则可以将这两个顶点合并,并将边加入最小生成树的集合中。
- 如果加入的边会导致形成环路,则不加入该边。
4. 当最小生成树的边数等于顶点数减1时,停止遍历。
5. 最终得到的最小生成树的边集合即为所求。
以下是一个克鲁斯卡尔算法实现最小生成树的示例代码:
```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):
root_x = self.find(x)
root_y = self.find(y)
if root_x != root_y:
if self.rank[root_x] < self.rank[root_y]:
self.parent[root_x] = root_y
elif self.rank[root_x] > self.rank[root_y]:
self.parent[root_y] = root_x
else:
self.parent[root_y] = root_x
self.rank[root_x] += 1
def kruskal(graph):
edges = []
for u in range(len(graph)):
for v in range(u + 1, len(graph)):
if graph[u][v] != float('inf'):
edges.append((u, v, graph[u][v]))
edges.sort(key=lambda x: x[2])
uf = UnionFind(len(graph))
min_spanning_tree = []
for edge in edges:
u, v, weight = edge
if uf.find(u) != uf.find(v):
uf.union(u, v)
min_spanning_tree.append(edge)
if len(min_spanning_tree) == len(graph) - 1:
break
return min_spanning_tree
# 示例使用
graph = [
[0, 2, 3, float('inf')],
[2, 0, float('inf'), 4],
[3, float('inf'), 0, 1],
[float('inf'), 4, 1, 0]
]
min_spanning_tree = kruskal(graph)
for edge in min_spanning_tree:
print(edge)
```
阅读全文