请阐述最小生成树算法的基本思想(Prim算法和Kruskal算法)。
时间: 2023-12-23 11:27:12 浏览: 141
用Prim和Kruskal算法构造最小生成树
5星 · 资源好评率100%
最小生成树算法是用于在一个连通无向图中找到一棵包含所有顶点的树,且树的边的权值之和最小。其中,Prim算法和Kruskal算法是两种常用的最小生成树算法。
Prim算法的基本思想是从一个顶点开始,逐步扩展生成树,每次选择与当前生成树相连的边中权值最小的边,并将其加入生成树中,直到生成树包含所有顶点为止。
Kruskal算法的基本思想是先将图中的所有边按照权值从小到大进行排序,然后依次选择权值最小的边,如果这条边的两个顶点不在同一个连通分量中,则将这条边加入最小生成树中,直到最小生成树中包含了所有顶点为止。
这两种算法的具体步骤可以参考以下示例代码:
1. Prim算法示例代码:
```python
def prim(graph):
n = len(graph)
visited = [False] * n
key = [float('inf')] * n
parent = [None] * n
key[0] = 0
for _ in range(n):
u = min_key(key, visited)
visited[u] = True
for v in range(n):
if graph[u][v] > 0 and not visited[v] and graph[u][v] < key[v]:
key[v] = graph[u][v]
parent[v] = u
return parent
def min_key(key, visited):
min_val = float('inf')
min_index = -1
for i in range(len(key)):
if not visited[i] and key[i] < min_val:
min_val = key[i]
min_index = i
return min_index
```
2. Kruskal算法示例代码:
```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 = []
n = len(graph)
for i in range(n):
for j in range(i+1, n):
if graph[i][j] > 0:
edges.append((i, j, graph[i][j]))
edges.sort(key=lambda x: x[2])
uf = UnionFind(n)
mst = []
for edge in edges:
u, v, weight = edge
if uf.find(u) != uf.find(v):
uf.union(u, v)
mst.append(edge)
return mst
```
阅读全文