单源点最短路径
证明过程应用自:http://kelvinsjtu.blog.163.com/blog/static/110030019200993104333703/
问题描述:
解法:
使用dijkstra算法来解决这个问题
dijkstra算法的思路:
Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
过程描述:
设G是带权图,图中的顶点多于一个,且所有的权都为正数。本算法确定从顶点S到G中其他各个顶点的距离和最短通路。在本算法中P表示带永久标记的顶点的集合。顶顶点U和V之间的边的权重用W(U,V)表示,如果U和V之间没有边,则记作W(U,V)=∞.
步骤1 (对S做标记)
(a)将S标记为0
(b)令P={S}
步骤2 (对其他顶点作标记)
将每个不在P中的顶点V标记为W(S,V)(可能是暂时的)
步骤3 (扩大P,修改标记)
Repeat
步骤3.1 (是另一个标记永久化)
把不在P中且带有最小标记的顶点U加入到P中去(如果这样的顶点有多个则任选其中一个)
步骤3.2 (修改临时标记)
对每个不在P中并且和U相邻的顶点X,把X的标记替换为下列这两者中的较小者:i)X的旧标记,ii)U上的标记与W(U,X)之和。
Until P包含G中的每一个顶点
算法证明:
证明:Dijkstra算法给出了从S到G的各个顶点的最短通路长度。
我们假设图中的每个顶点V都被赋予了一个标记L(V),它要么是一个数,要么是∞。假设P是G的顶点的集合,P包含S,满足:
1)如果V属于P,则L(V)是从S到V的最短通路的长度,并且存在这样的从S到V的最短通路:通路上的顶点都在P中
2)如果V不属于P,则L(V)是从S到V的满足下面限制的最短通路的长度:V是通路中唯一一个不属于P的顶点。
我们可以用归纳法证明Dijkstra算法中的P符合上述定义的集合:
1)当P中元素个数为1时,P对应算法中的第一步,P={S},显然满足。
2)假设P中元素个数为K时,P满足上述定义,下面看算法的的第三步,
先找出不在P中且带有最小标记的顶点U,标记为L(U), 可以证明从S到U的最短通路中除U外不包含不属于P的元素。
因为若存在除U外其他顶点,则最短通路为SP1P2...PnQ1Q2...QnU(P1,P2..Pn属于P,Q1,Q2,...Qn不属于P),则由性质2)最短通路长度为L(Q1)+PATH(Q1,U)>L(U)
从而大于SP1P2..PnU的通路长度L(U),不是最短通路,所以从S到U的最短通路中除U外不包含不属于P的元素,从而从S到U的最短通路长度由L(U)给出.
现把U加入P中构成P' ,显然P'满足性质1)。
取V不属于P',显然V也不属于P,那么从S到V的最短通路且满足除V外所有顶点都在P'中的通路有两种可能,i)包含U,ii)不包含U。
对i)SP1P2...PnUV=L(U)+W(U,V)
ii)SP1P2..PnV=L(V)
显然二者中的最小给出了从S到V的最短通路且满足除V外所有顶点都在P'中的长度。
从而算法第三步给出的P'含K+1个元素且满足1),2)。
又归纳,命题得证!
实例说明:
迭代 |
s |
u |
dist[2] |
dist[3] |
dist[4] |
dist[5] |
初始 |
{1} |
- |
10 |
maxint |
30 |
100 |
1 |
{1,2} |
2 |
10 |
60 |
30 |
100 |
2 |
{1,2,4} |
4 |
10 |
50 |
30 |
90 |
3 |
{1,2,4,3} |
3 |
10 |
50 |
30 |
60 |
4 |
{1,2,4,3,5} |
5 |
10 |
50 |
30 |
60 |