c語言演算法

來源:互聯網
上載者:User

在這個問題中,給出有向圖G,它的每條邊都有一個非負的長度(耗費) a [i ][ j ],路徑的長度即為此路徑所經過的邊的長度之和。對於給定的源頂點s,需找出從它到圖中其他任意頂點(稱為目的)的最短路徑。圖13-10a 給出了一個具有五個頂點的有向圖,各邊上的數即為長度。假設源頂點s 為1,從頂點1出發的最短路徑按路徑長度順序列在圖13-10b 中,每條路徑前面的數字為路徑的長度。

利用E. Dijkstra發明的貪婪演算法可以解決最短路徑問題,它通過分步方法求出最短路徑。每一步產生一個到達新的目的頂點的最短路徑。下一步所能達到的目的頂點通過如下貪婪準則選取:在還未產生最短路徑的頂點中,選擇路徑長度最短的目的頂點。也就是說, D i j k s t r a的方法按路徑長度順序產生最短路徑。

首先最初產生從s 到它自身的路徑,這條路徑沒有邊,其長度為0。在貪婪演算法的每一步中,產生下一個最短路徑。一種方法是在目前已產生的最短路徑中加入一條可行的最短的邊,結果產生的新路徑是原先產生的最短路徑加上一條邊。這種策略並不總是起作用。另一種方法是在目前產生的每一條最短路徑中,考慮加入一條最短的邊,再從所有這些邊中先選擇最短的,這種策略即是D i j k s t r a演算法。

可以驗證按長度順序產生最短路徑時,下一條最短路徑總是由一條已產生的最短路徑加上一條邊形成。實際上,下一條最短路徑總是由已產生的最短路徑再擴充一條最短的邊得到的,且這條路徑所到達的頂點其最短路徑還未產生。例如在圖1 3 - 1 0中,b 中第二條路徑是第一條路徑擴充一條邊形成的;第三條路徑則是第二條路徑擴充一條邊;第四條路徑是第一條路徑擴充一條邊;第五條路徑是第三條路徑擴充一條邊。

通過上述觀察可用一種簡便的方法來儲存最短路徑。可以利用數組p,p [ i ]給出從s 到達i的路徑中頂點i 前面的那個頂點。在本例中p [ 1 : 5 ] = [ 0 , 1 , 1 , 3 , 4 ]。從s 到頂點i 的路徑可反向建立。從i 出發按p[i],p[p[i]],p[p[p[i]]], .的順序,直到到達頂點s 或0。在本例中,如果從i = 5開始,則頂點序列為p[i]=4, p[4]=3, p[3]=1=s,因此路徑為1 , 3 , 4 , 5。

為能方便地按長度遞增的順序產生最短路徑,定義d [ i ]為在已產生的最短路徑中加入一條最短邊的長度,從而使得擴充的路徑到達頂點i。最初,僅有從s 到s 的一條長度為0的路徑,這時對於每個頂點i,d [ i ]等於a [ s ] [ i ](a 是有向圖的長度鄰接矩陣)。為產生下一條路徑,需要選擇還未產生最短路徑的下一個節點,在這些節點中d值最小的即為下一條路徑的終點。當獲得一條新的最短路徑後,由於新的最短路徑可能會產生更小的d值,因此有些頂點的d值可能會發生變化。

綜上所述,可以得到圖1 3 - 11所示的虛擬碼, 1) 將與s 鄰接的所有頂點的p 初始化為s,這個初始化用於記錄當前可用的最好資訊。也就是說,從s 到i 的最短路徑,即是由s到它自身那條路徑再擴充一條邊得到。當找到更短的路徑時, p [ i ]值將被更新。若產生了下一條最短路徑,需要根據路徑的擴充邊來更新d 的值。

1) 初始化d[i ] =a[s] [i ](1≤i≤n),

對於鄰接於s的所有頂點i,置p[i ] =s, 對於其餘的頂點置p[i ] = 0;

對於p[i]≠0的所有頂點建立L表。

2) 若L為空白,終止,否則轉至3 )。

3) 從L中刪除d值最小的頂點。

4) 對於與i 鄰接的所有還未到達的頂點j,更新d[ j ]值為m i n{d[ j ], d[i ] +a[i ][ j ] };若d[ j ]發生了變化且j 還未

在L中,則置p[ j ] = 1,並將j 加入L,轉至2。

圖1 - 11 最短路徑演算法的描述

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.