普里姆算法求最小生成树。
时间: 2023-11-20 15:55:25 浏览: 104
最小生成树之普里姆prim算法C++实现
普里姆算法是一种用于求解加权无向连通图的最小生成树的算法。其基本思想是从一个顶点开始,每次选择一个与当前生成树相邻的权值最小的顶点加入生成树中,直到所有顶点都被加入为止。具体步骤如下:
1. 任选一个顶点作为起始点,将其加入生成树中。
2. 找到与当前生成树相邻的所有顶点,并计算它们与当前生成树的距离(即边的权值)。
3. 选择距离最小的顶点,将其加入生成树中。
4. 重复步骤2和3,直到所有顶点都被加入为止。
下面是一个Python实现的例子:
```python
def prim(graph):
# 初始化生成树和已经加入生成树的顶点集合
mst = []
visited = set()
# 任选一个顶点作为起始点
start = list(graph.keys())[0]
visited.add(start)
while len(visited) < len(graph):
# 找到与当前生成树相邻的所有顶点,并计算它们与当前生成树的距离
candidates = []
for v in visited:
for w, weight in graph[v].items():
if w not in visited:
candidates.append((v, w, weight))
# 选择距离最小的顶点,将其加入生成树中
edge = min(candidates, key=lambda x: x[2])
mst.append(edge)
visited.add(edge[1])
return mst
```
其中,`graph`是一个字典,表示无向图的邻接表。字典的键是顶点,值是一个字典,表示与该顶点相邻的顶点及其边的权值。例如,对于下面这个无向图:
```
2
/ \
1 3
\ /
4
```
其邻接表可以表示为:
```python
graph = {
1: {2: 2, 4: 1},
2: {1: 2, 3: 3},
3: {2: 3, 4: 4},
4: {1: 1, 3: 4}
}
```
调用`prim(graph)`函数即可求出该图的最小生成树。
阅读全文