python计算带权有向图从源点到其他所有点的最单路径长度。
时间: 2024-05-03 10:17:39 浏览: 104
求带权图最短路径的代码
5星 · 资源好评率100%
可以使用Dijkstra算法来计算带权有向图从源点到其他所有点的最短路径长度。
具体步骤如下:
1. 初始化一个距离数组dist,将源点到所有点的距离都设置为一个很大的数(比如无穷大),将源点的距离设置为0。
2. 初始化一个集合S,用来存放已经找到最短路径的节点。
3. 选择距离源点最近的节点v,将v加入集合S中。
4. 对于v的每一个邻居节点u,如果u还没有在集合S中,那么计算源点到u的距离,并且如果这个距离小于dist[u],那么更新dist[u]的值。
5. 重复步骤3和4,直到集合S包含所有的节点。
最终dist数组中存储的就是源点到所有点的最短路径长度。
下面是使用Python实现Dijkstra算法的示例代码:
```python
import heapq
def dijkstra(graph, start):
# 初始化距离数组
dist = {node: float('inf') for node in graph}
dist[start] = 0
# 初始化集合S
visited = set()
# 使用堆存储节点,每次选择距离最小的节点
heap = [(0, start)]
while heap:
(cost, node) = heapq.heappop(heap)
if node in visited:
continue
visited.add(node)
# 更新所有邻居节点的距离
for neighbor, weight in graph[node].items():
if neighbor not in visited:
new_cost = dist[node] + weight
if new_cost < dist[neighbor]:
dist[neighbor] = new_cost
heapq.heappush(heap, (new_cost, neighbor))
return dist
```
其中,graph是一个字典,存储了所有节点之间的边和权重信息。start表示源点的位置。函数返回一个字典,存储了源点到其他所有点的最短路径长度。
阅读全文