E81086713E446D36F62B2AA2A3502B5EB155

Java杂家

杂七杂八。。。一家之言

BlogJava 首页 新随笔 联系 聚合 管理
  141 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks

算法:

设G是带权图,图中的顶点多于一个,且所有的权都为正数。本算法确定从顶点S到G中其他各个顶点的距离和最短通路。在本算法中P表示带永久标记的顶点的集合。顶点A的前驱是P中的一个顶点,用来标记A。顶点U和V之间的边的权重用W(U,V)表示,如果U和V之间没有边,则记作W(U,V)=∞.

步骤1 (对S做标记)

      (a)将S标记为0,并使S没有前驱

      (b)令P={S}

步骤2 (对其他顶点作标记)

      将每个不在P中的顶点V标记为W(S,V)(可能是暂时的),并使V的前驱为S(可能是暂时的)

步骤3 (扩大P,修改标记)

     Repeat

     步骤3.1 (是另一个标记永久化)

                  把不在P中且带有最小标记的顶点U加入到P中去(如果这样的顶点有多个则任选其中一个)

    步骤3.2  (修改临时标记)

                对每个不在P中并且和U相邻的顶点X,把X的标记替换为下列这两者中的较小者:i)X的旧标记,ii)U上的标记与W(U,X)之和。如果X的标记改变了,则使U成为X的新前驱(可能是暂时的)

    Until P包含G中的每一个顶点

步骤4 (求出距离和最短通路)

   顶点Y上的标记是从S到Y的距离。如果Y上的标记是∞,那么从S到Y就没有通路,从而

没有最短通路;否则,按照下列序列的逆序使用顶点就构成从S到Y的一条最短通路:

Y,Y的前驱,Y的前驱的前驱,。。。。,直至S

 

 

证明:Dijkstra算法给出了从S到G的各个顶点的最短通路长度。

 

我们假设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)。

又归纳,命题得证!

 

下面是一个Java版的实现:最短路径的Java实现

posted on 2007-09-07 13:24 DoubleH 阅读(6191) 评论(3)  编辑  收藏

Feedback

# re: Dijkstra算法及其证明 2007-12-19 22:15 柏拉圆
“顶点U和V之间的边上的权”这句话不妥当。
连接顶点U与V的边的权重。  回复  更多评论
  

# re: Dijkstra算法及其证明 2007-12-19 23:19 Javacap
@柏拉圆
谢谢提醒,已改过!  回复  更多评论
  

# re: Dijkstra算法及其证明 2009-04-20 11:16 westwind
因为若存在除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外其他顶点,设最短通路为SP1P2...PnQ1Q2...QmU(P1,P2..Pn属于P,Q1,Q2,...Qm不属于P,m>0)。由性质2),其长度必不小于L(Q1)+PATH(Q1,U),而后者必大于L(U),因而不是由S到U的最短通路,与前设矛盾。所以从S到U的最短通路中除U外不包含不属于P的元素,从而从S到U的最短通路长度由L(U)给出.

  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: