1. 单源最短路径问题概述
单源最短路径(Single-Source Shortest Path,SSSP)是图论中最基础也最经典的问题之一。简单来说,就是给定一个带权有向图G=(V,E)和一个源顶点s,找出从s到图中所有其他顶点的最短路径。这里的"最短"指的是路径上所有边的权值之和最小。
我第一次接触这个问题是在大学的数据结构课上,当时觉得Dijkstra算法简直像变魔术一样神奇。后来在实际工作中,我发现SSSP的应用远比想象中广泛——从导航软件中的路线规划,到网络路由中的包转发决策,甚至社交网络中的影响力传播分析,都离不开这个基础算法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 经典算法对比与选型
2.1 Dijkstra算法:非负权图的黄金标准
Dijkstra算法由荷兰计算机科学家Edsger W. Dijkstra在1956年提出,是解决非负权图SSSP问题的最优选择。它的核心思想是贪心策略,通过维护一个优先队列来逐步扩展已知的最短路径。
python复制def dijkstra(graph, start):
distances = {vertex: float('infinity') for vertex in graph}
distances[start] = 0
pq = [(0, start)]
while pq:
current_distance, current_vertex = heapq.heappop(pq)
if current_distance > distances[current_vertex]:
continue
for neighbor, weight in graph[current_vertex].items():
distance = current_distance + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(pq, (distance, neighbor))
return distances
这个算法的时间复杂度取决于优先队列的实现:
- 数组实现:O(V²)
- 二叉堆:O((V+E)logV)
- 斐波那契堆:O(E + VlogV)
实际工程中,当图比较稀疏时(E≈V),二叉堆实现通常是最佳选择。我在处理城市道路网络时就采用了这种实现,实测性能比数组实现快10倍以上。
2.2 Bellman-Ford算法:处理负权边的利器
当图中存在负权边时,Dijkstra算法就不再适用。这时Bellman-Ford算法就派上用场了。它的时间复杂度是O(VE),虽然比Dijkstra慢,但能检测负权环——这个特性在网络路由协议中有重要应用。
python复制def bellman_ford(graph, start):
distances = {vertex: float('infinity') for vertex in graph}
distances[start] = 0
for _ in range(len(graph) - 1):
for vertex in graph:
for neighbor, weight in graph[vertex].items():
if distances[vertex] +
