數據結構—弗洛伊德算法

在數據結構的學習當中,圖的處理是必不可少的一項,對圖進行處理時,最短路徑的求取具有較強的使用性和可行性,在此,我簡單地對求取最短路徑的算法之一——弗洛伊德算法做出簡單的講解。

弗洛伊德算法在實現的時候一個重要的特點就是用循環(huán)的嵌套來進行逐個的判斷和更新。此算法區(qū)分于迪杰斯特拉算法的很大的優(yōu)點就是弗洛伊德算法可以在實現過后實現了圖中每一個結點的對其余各個結點的最短路徑,而后者只是針對一個目標結點計算出該結點到其他結點的最短路徑。但是,由于這次只是做弗洛伊德算法的講解,對于迪杰斯特拉算法便不予贅述。

如果要求任意兩個結點之間的最短路徑,我們可能已經有了簡單的想法,在兩個結點之間存在直接的路徑時,比較這個路徑和經過一次結點的中轉,甚至二次、三次、以及多次的中轉之后的權值之和比較,最短的權值之和就可以確定該路徑為最短路徑;若兩者沒有直接路徑,則需考慮在經過結點的中轉以后,無論經過了幾次中轉結點,只要選出權值最短的路徑,該路徑就是最短路徑。

這便是最短路徑的求取方法。

這個過程看似實現較難,但加上了一些輔助變量后,便可以順利實現。

但是要加入哪些輔助變量呢?首先需要考慮到的是path數組存放計算出的最短路徑的結果。行標表示起點結點,列標表示終點結點,則該位置存放的數據則是終點結點的前一個結點。

例如:從a到達c的最短路徑為:a—》b—》c;若a的下標是1;c的下標是4;b的下標是2;則path[1][4]=2;若從c到e的最短路徑是c—》d—》a—》e;c,d,a,e的下標分別為3,4,1,5;

則path[3][5]=1;在查找最短路徑時的順序則是path[3][5]=1,path[3][1]=4;path[3][4]=3;路徑順序就為:下標5《--1《--4《--3。

另外,需要加入輔助數組D,該數組用于記錄兩結點直接的最短路徑長度如D[0][3]=3;表示從0到3的最短路徑長度為3;

現在,讓我們回到上述自己設想的問題,如何比較兩個結點之間的路徑長度和呢?

在弗洛伊德算法中,采用的方法是權值的更新,以下是弗洛伊德的具體算法,以便于講解


下面開始對代碼展開講解:

個人認為,算法的實現可以分為兩部分,其中每一部分可以用以上的兩個for循環(huán)來劃分,第一個for循環(huán)如下,進行的是權值和路徑的初始化

D[i][j]=G.arc[i][j]; ? ? ? ? ?//將下標為i的結點與相關的結點權值初始化,如果有直接路徑,則長度是已知權值,否則的初始化結果是無窮

if (D[i][j]<Maxint)

p[i][j]=i; ? ? ? ? ? ? ? ? ? ? ? //已初始化后,有直接路徑的話終點結點的前一個結點便是起點結點

else

p[i][j]=0; ? ? ? ? ? ? ? ? ? ? ?//沒有直接路徑,進行特殊標記。

進行了初始化之后,數組D內的元素應該與圖D的權值數組G.arc相等,并且數組path內的數據也根據圖中結點間的關系獲得了初值。

第二部分體現為針對兩個目標結點加入圖中的每一個結點作為中轉結點進行路徑長度的判斷,根據判斷結果更新兩個數組內容,這個算法很容易使人聯想到密碼破解時使用的窮舉法。

代碼如下:

for (i=0;i<G.vexnum;i++)

for(j=0;j<G.vexnum;j++) ? ? ?//起始結點

for(k=0;k<G.vexnum;k++) ? ?//終點結點

if (D[j][k]>D[j][i]+D[i][k]) ? ? //j,k是需要更新的兩個結點,現在欲在這兩個結點中加入下標為i的結點,并判斷加入新的結點以后的路徑長度。

{

D[j][k]=D[j][i]+D[i][k];

p[j][k]=p[k][i]; ? ? ? ? ? ? ? ? ? //可以更新,則進行數據更新。

}

到此,循環(huán)結束,最短路徑的查找也完成。

需要說明的是,每一次數據的更新,path數組都保存有前一個結點的信息,如圖:


首先path[0][1]=0;D[0][1]=6;之后,有初始化后的結果:path[0][2]=0,D[0][2]=1,2和1之間沒有路徑故D[2][1]=Maxint,path[0][1],D[0][1]無需更新,之后,判斷0和3,D[0][3]=Maxint是初始化的結果,更新加入2之后成了path[0][3]=2;D[0][3]=3;path[2][3]=0,D[2][3]=2,path[3][1],D[3][1]=1加入任意結點之后無需更新,故保持;再進行path[0][1],D[0][1]的判斷時,嘗試加入結點2,不成功,再嘗試加入點3時,由于D[0][3]已經更新為3,所以滿足更新條件,D[0][1]=4,path[0][1]=3完成了從0到1中間大于1個中轉結點的實現。

總結在于,第二部分使用三個for語句的嵌套起到了重要的作用,數據的更新和信息的保存也需要準確理解。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 圖的概念 圖是一種非線性的數據結構,一個圖中有兩類東西,一種是結點,一種是邊.我們用V這個集合來表示節(jié)點(vert...
    fredal閱讀 2,339評論 2 14
  • 維基百科的說法: A搜索算法,俗稱A星算法*。這是一種在圖形平面上,有多個節(jié)點的路徑,求出最低通過成本的算法。常用...
    wangzun閱讀 1,429評論 0 4
  • 貪心算法 貪心算法總是作出在當前看來最好的選擇。也就是說貪心算法并不從整體最優(yōu)考慮,它所作出的選擇只是在某種意義上...
    fredal閱讀 9,262評論 3 52
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結點至多有m個孩子。 除根結點和葉子結點外,其它每個結點至少有m...
    文檔隨手記閱讀 13,282評論 0 25
  • 課程介紹 先修課:概率統計,程序設計實習,集合論與圖論 后續(xù)課:算法分析與設計,編譯原理,操作系統,數據庫概論,人...
    ShellyWhen閱讀 2,329評論 0 3