Dijkstra概念
要找出最短路径,其实就是从起点遍历所有能到达的顶点,然后计算他们的权重。Dijkstra算法核心在于边的松弛(relax),可以想象成一根绷紧的橡皮筋,让它放松下来。即是计算源点(s)经过当前点(v)到目标点(w)的权重,如果比目标点(w)之前的权重要小,就替换掉。最终的结果就是生成一颗最小路径树。这个算法和prim算法非常相似,甚至就是prim即时算法的变种。如果加权无向图和加权有向图的边和权重对应,最短路径树和最小生成树其实是等价的。
Dijkstra算法并不能处理权重为负数的边。
到
有弧(即从
到
存在连接边),则D
为弧上的权值(即为从
到
的边的权值);否则置D
为∞。
= Min{ D |
∈V } 的路径就是从
出发到顶点
的长度最短的一条路径,此路径为(
)。
到下一个顶点的最短路径长度所对应的顶点,且这条最短路径长度仅次于从源点
到顶点
的最短路径长度。
,则可想而知,这条路径要么是(
),或者是(
)。它的长度或者是从
到
的弧上的权值,或者是D
加上从
到
的弧上的权值。
出发的最短路径长度的顶点的集合,则可证明:下一条次最短路径(设其终点为
)要么是弧(
),或者是从源点
出发的中间只经过S中的顶点而最后到达顶点
的路径。
= Min{ D
|
∈V-S },其中D
要么是弧(
)上的权值,或者是D
(
∈S)和弧(
,
)上的权值之和。
出发的的终点的集合,初始状态为空集。那么,从
出发到图上其余各顶点
可能达到的长度的初值为D=arcs[Locate Vex(G,
)],
∈V;
,使得D
=Min{ D |
∈V-S } ;
出发的到集合V-S中任一顶点
的最短路径长度。