Dijkstra算法原理及證明(轉)


算法:

設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)。

又歸納,命題得證!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM