单源最短路径
问题
- 给定一个带权有向图,选中一个结点称为源点,计算源点到其他结点的最短路径长度。
解题步骤
-
给定一个集合S,初始化S={ s },s表示源点,S中的点表示已经找到了从u(u属于V)到s的最短路径。当S=V的时候,即S包含所有结点的时候算法结束,即已经找到了s(源点)到其他所有点的最短路径。
-
从s到u相对于S的最短路径:从s到u且只经过S中的点的最短路径。
-
dist[u]:从s到u相对S的最短路径长度。
-
short[u]:从s到u的最短路径长度。
-
short[u] <= dist[u]
- 因为s到u如果不经过S中的点,即没有路径从s到u,此时最短路径长度为无穷大。而short[u]中s到u没有S限制。
- 当2者相等的时候,即S中已经包含了所有结点时,算法结束。
算法设计思想
实例演示
- 如图所示,一开始S中只有源点,dist[1] = 0 表示只经过S中的点从1(s:源点)到1 (u:其他点)的最短路径长度为0。再如dist[2] = 10 表示从1到2,且只经过S中的点的最短路径长度为10。dist[3] = 无穷大,因为从1到3需要经过S中不存在的点。
- 计算出所有dist后选择最小的,即dist[6] = 3 ,把点6加入S中。
- 然后更新dist,dist[2]更新为5,从1-6-2路径长度为5 < 1-2路径长度10。
- 计算好dist后选出最小的dist[5],把5放进S中,以此类推。
- 当所有结点都在S中时,算法结束,此时dist = short,short[u]即为s到u的最短路径长度。