本次笔记内容:
7.1.1 概述
7.1.2 无权图的单源最短路
7.1.3 有权图的单源最短路
7.1.3-s 有权图的单源最短路示例
7.1.4 多源最短路算法
文章目录
最短路径问题
最短路径问题的抽象
在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径。
- 这条路径就是两点之间的最短路径(Shortest Path);
- 第一个顶点为源点(Source);
- 最后一个顶点为终点(Destination)。
问题分类
- 单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径:
-
- (有向/无向)无权图
-
- (有向/无向)有权图
- 多源最短路径问题:求任意两顶点间的最短路径
无权图的单源最短路算法
- 按照递增(非递减)的顺序找出各个顶点的最短路。实际上就是广度优先搜索算法(BFS)。
void Unweighted(Vertex S)
{
Enqueue(S, Q);
while (!IsEmpty)
{
V = Dequeue(Q);
for (V的每个邻接点W)
if (dist[W] == -1)
{
dist[W] = dist[V] + 1;
path[W] = V;
Enqueue(W, Q);
}
}
}
dist[W] = S到W的最短距离
dist[S] = 0
path[W] = S到W的路上经过的某顶点
假设上述图用邻接表存储,上述算法的时间复杂度为 T = O ( ∣ V ∣ + ∣ E ∣ ) T=O(|V|+|E|) T=O(∣V∣+∣E∣)。
有权图的单源最短路算法
负值圈(negative-cost cycle)
如上图,如果存在负值圈(negative-cost cycle),则进入无限循