python实现prim
时间: 2023-09-14 07:14:01 浏览: 105
Prim算法是一种常见的最小生成树算法,可以用来解决带权无向连通图的最小生成树问题。下面是Python实现Prim算法的示例代码:
```
from queue import PriorityQueue
def prim(graph, start):
visited = set()
mst = []
pq = PriorityQueue()
visited.add(start)
for neighbor, weight in graph[start].items():
pq.put((weight, start, neighbor))
while not pq.empty():
weight, u, v = pq.get()
if v not in visited:
visited.add(v)
mst.append((u, v, weight))
for neighbor, weight in graph[v].items():
pq.put((weight, v, neighbor))
return mst
```
这里使用了优先队列来维护当前候选边集合,以便每次选择权值最小的边进行扩展。同时,使用集合来记录已经访问过的节点,以避免重复扩展。
相关问题
python实现prim算法
Prim算法是一种求解最小生成树的贪心算法,以下是Python实现:
```python
def prim(graph):
# 初始化
visited = set()
unvisited = set(graph.keys())
start = unvisited.pop()
visited.add(start)
edges = [(weight, start, neighbor) for neighbor, weight in graph[start].items()]
# 开始贪心
while unvisited:
# 选择最小边
weight, frm, to = min(edges)
edges.remove((weight, frm, to))
# 如果终点未被访问过,则加入最小生成树
if to in unvisited:
unvisited.remove(to)
visited.add(to)
yield frm, to, weight
# 更新可选边
for neighbor, weight in graph[to].items():
if neighbor in unvisited:
edges.append((weight, to, neighbor))
```
这个函数接受一个字典作为参数,字典的键是节点,值是另一个字典,它的键是相邻节点,值是权重。函数返回一个生成器,每次迭代返回一个三元组,表示加入最小生成树的一条边和它的权重。
用python实现prim算法的一个实列
Prim算法是一种求解最小生成树的经典算法,其基本思想是从一个点出发,每次选取与当前生成树距离最近的点加入生成树,直到所有点都被加入生成树。下面是用Python实现Prim算法的代码实例:
```python
#定义Prim算法函数
def Prim(graph):
nodes = list(graph.keys())
visited = [nodes]
unvisited = nodes[1:]
tree = []
while unvisited:
min_weight = float('inf')
for node_visited in visited:
for node_unvisited in unvisited:
if graph[node_visited][node_unvisited] < min_weight:
min_weight = graph[node_visited][node_unvisited]
edge = (node_visited, node_unvisited)
tree.append(edge)
visited.append(edge)
unvisited.remove(edge)
return tree
#测试代码
graph = {'A': {'B': 7, 'D': 5},
'B': {'A': 7, 'C': 8, 'D': 9, 'E': 7},
'C': {'B': 8, 'E': 5},
'D': {'A': 5, 'B': 9, 'E': 15, 'F': 6},
'E': {'B': 7, 'C': 5, 'D': 15, 'F': 8, 'G': 9},
'F': {'D': 6, 'E': 8, 'G': 11},
'G': {'E': 9, 'F': 11}}
tree = Prim(graph)
print(tree)
```
以上代码中,我们定义了一个Prim算法函数,传入一个图(用字典表示),返回一个最小生成树的边集。具体实现过程是:首先选取第一个节点作为已访问节点,将其加入已访问节点集合visited中,其余节点加入未访问节点集合unvisited中。然后在未访问节点集合中寻找与已访问节点集合中距离最近的节点,将它们之间的边加入生成树的边集中。接着将这个新加入的节点加入已访问节点集合中,并从未访问节点集合中删除。循环此过程直到未访问节点集合为空,此时返回生成树的边集即可。
阅读全文
相关推荐
![-](https://img-home.csdnimg.cn/images/20250102104920.png)
![-](https://img-home.csdnimg.cn/images/20250102104920.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)