数据结构单源最短路径
时间: 2023-12-21 13:30:13 浏览: 92
单源最短路径是指从图中的一个源点出发,到达图中其他所有顶点的最短路径。数据结构中常用的两种单源最短路径算法是Dijkstra算法和Bellman-Ford算法。
1. Dijkstra算法:
Dijkstra算法是一种贪心算法,用于解决带权有向图或无向图的单源最短路径问题。该算法的基本思想是:将图中的所有顶点分成两个集合,一个集合为已求出最短路径的顶点集合S,另一个为未求出最短路径的顶点集合V-S。初始时,集合S中只有源点,即S={v},V-S为除源点外的其他顶点。然后,从V-S中选择与源点距离最短的顶点u,将其加入到S中,并更新从源点v到集合V-S中所有顶点的距离。重复执行该过程,直到集合V-S为空。
2. Bellman-Ford算法:
Bellman-Ford算法是一种动态规划算法,用于解决带权有向图或无向图的单源最短路径问题。该算法的基本思想是:对于图中的任意一条边(u,v),如果存在从源点s到u的最短路径,则从源点s到v的最短路径就是从源点s到u的最短路径加上边(u,v)的权值。因此,Bellman-Ford算法通过对所有边进行松弛操作,不断更新从源点s到各个顶点的最短路径估计值,直到所有边的松弛操作都无法使最短路径估计值发生变化为止。
下面是两种算法的Python实现:
1. Dijkstra算法:
```python
import heapq
def dijkstra(graph, start):
# 初始化距离字典和堆
dist = {node: float('inf') for node in graph}
dist[start] = 0
heap = [(0, start)]
# 循环直到堆为空
while heap:
# 弹出堆中距离最小的顶点
(d, node) = heapq.heappop(heap)
# 如果该顶点已经处理过,则跳过
if d > dist[node]:
continue
# 遍历该顶点的所有邻居
for neighbor, weight in graph[node].items():
# 计算从起点到该邻居的距离
distance = dist[node] + weight
# 如果该距离比已有的距离小,则更新距离字典和堆
if distance < dist[neighbor]:
dist[neighbor] = distance
heapq.heappush(heap, (distance, neighbor))
return dist
```
2. Bellman-Ford算法:
```python
def bellman_ford(graph, start):
# 初始化距离字典
dist = {node: float('inf') for node in graph}
dist[start] = 0
# 循环V-1次,对所有边进行松弛操作
for i in range(len(graph) - 1):
for u in graph:
for v, weight in graph[u].items():
if dist[u] + weight < dist[v]:
dist[v] = dist[u] + weight
# 检查是否存在负权回路
for u in graph:
for v, weight in graph[u].items():
if dist[u] + weight < dist[v]:
raise ValueError("Graph contains negative weight cycle")
return dist
```
阅读全文