漫畫(huà):如何求圖的最短路徑

原文鏈接https://mp.weixin.qq.com/s/HIeA8Cg4-lEodmH9mIFCRQ

—————? 第二天? —————

小灰的思路如下:

第一步,利用迪杰斯特拉算法的距離表薇正,求出從頂點(diǎn)A出發(fā)柑晒,到其他各個(gè)頂點(diǎn)的最短距離:

第二步欧瘪,繼續(xù)使用迪杰斯特拉算法,求出從頂點(diǎn)B出發(fā)匙赞,到其他各個(gè)頂點(diǎn)的最短距離佛掖。

第三步妖碉,從頂點(diǎn)C出發(fā),到各個(gè)頂點(diǎn)的最短距離苦囱。

第四步嗅绸,從頂點(diǎn)D出發(fā)......

.......

就像這樣,一直遍歷到頂點(diǎn)G撕彤。

這個(gè)思路的時(shí)間復(fù)雜度是多少呢鱼鸠?

假如圖中有n個(gè)頂點(diǎn),如果不考慮堆優(yōu)化羹铅,一次迪杰斯特拉算法的時(shí)間復(fù)雜度是O(n^2)蚀狰。所以,把每一個(gè)頂點(diǎn)都計(jì)算一遍职员,總的時(shí)間復(fù)雜度是O(n^3)麻蹋。

舉一個(gè)栗子:

上圖的頂點(diǎn)A和頂點(diǎn)C沒(méi)有直接相連的邊,它們之間的直接距離是無(wú)窮大焊切。

如果以B作為“中繼頂點(diǎn)”扮授,此時(shí)A到C的最短路徑就是A-B-C,最短距離是3+2=5专肪。

再舉一個(gè)栗子:

上圖的頂點(diǎn)A和頂點(diǎn)C直接相連刹勃,距離是6。但是存在一條“迂回”路徑A-B-C嚎尤,距離是3+2=5<6荔仁。

所以,經(jīng)過(guò)中繼頂點(diǎn)B芽死,從A到C的最短距離可以是5乏梁。

下面我們來(lái)看一看Floyd算法的詳細(xì)步驟。

1.要實(shí)現(xiàn)Floyd算法关贵,首先需要構(gòu)建帶權(quán)圖的鄰接矩陣:

在鄰接矩陣當(dāng)中遇骑,每一個(gè)數(shù)字代表著從某個(gè)頂點(diǎn)到另一個(gè)頂點(diǎn)的直接距離,這個(gè)距離是沒(méi)有涉及到任何中繼頂點(diǎn)的揖曾。

2.此時(shí)假定只允許以頂點(diǎn)A作為中繼頂點(diǎn)质蕉,那么各頂點(diǎn)之間的距離會(huì)變成什么樣子呢?

B和C之間的距離原本是無(wú)窮大翩肌,此時(shí)以A為中繼,距離縮短為AB距離+AC距離=

5+2=7禁悠。

更新對(duì)應(yīng)矩陣元素(橙色區(qū)域代表頂點(diǎn)A到其他頂點(diǎn)的臨時(shí)距離):

3.接下來(lái)以頂點(diǎn)A念祭、B作為中繼頂點(diǎn),那么各頂點(diǎn)之間的距離會(huì)變成什么樣子呢碍侦?

A和D之間的距離原本是無(wú)窮大粱坤,此時(shí)以B為中繼隶糕,距離縮短為AB距離+BD距離=5+1=6。

A和E之間的距離原本是無(wú)窮大站玄,此時(shí)以B為中繼枚驻,距離縮短為AB距離+BE距離=5+6=11。

更新對(duì)應(yīng)矩陣元素(橙色區(qū)域代表頂點(diǎn)B到其他頂點(diǎn)的臨時(shí)距離):

4.接下來(lái)以頂點(diǎn)A株旷、B再登、C作為中繼頂點(diǎn),那么各頂點(diǎn)之間的距離會(huì)變成什么樣子呢晾剖?

A和F之間的距離原本是無(wú)窮大锉矢,此時(shí)以C為中繼,距離縮短為AC距離+CF距離=2+8=10齿尽。

更新對(duì)應(yīng)矩陣元素(橙色區(qū)域代表頂點(diǎn)C到其他頂點(diǎn)的臨時(shí)距離):

以此類(lèi)推沽损,我們不斷引入新的中繼頂點(diǎn),不斷刷新矩陣中的臨時(shí)距離循头。

最終绵估,當(dāng)所有頂點(diǎn)都可以作為中繼頂點(diǎn)時(shí),我們的距離矩陣更新如下:

此時(shí)卡骂,矩陣中每一個(gè)元素国裳,都對(duì)應(yīng)著某頂點(diǎn)到另一個(gè)頂點(diǎn)的最短距離。

為什么這么說(shuō)呢偿警?讓我們回顧一下動(dòng)態(tài)規(guī)劃的兩大要素:

問(wèn)題的初始狀態(tài)

問(wèn)題的狀態(tài)轉(zhuǎn)移方程式

對(duì)于尋找圖的所有頂點(diǎn)之間距離的問(wèn)題躏救,初始狀態(tài)就是頂點(diǎn)之間的直接距離,也就是鄰接矩陣螟蒸。

而問(wèn)題的狀態(tài)轉(zhuǎn)移方程式又是什么呢盒使?

假設(shè)新引入的中繼頂點(diǎn)是n,那么:

頂點(diǎn)i 到 頂點(diǎn)j 的新距離 = Min(頂點(diǎn)i 到 頂點(diǎn)j 的舊距離七嫌,頂點(diǎn)i 到 頂點(diǎn)n 的距離+頂點(diǎn)n 到 頂點(diǎn)j 的距離)

final static int INF = Integer.MAX_VALUE;

public static void floyd(int[][] matrix){

? ? //循環(huán)更新矩陣的值

? ? for(int k=0; k<matrix.length; k++){

? ? ? ? for(int i=0; i<matrix.length; i++){

? ? ? ? ? ? for(int j=0; j<matrix.length; j++){

? ? ? ? ? ? ? ? if(matrix[i][k] == INF || matrix[k][j] == INF) {

? ? ? ? ? ? ? ? ? ? continue;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? matrix[i][j] = Math.min(matrix[i][j], matrix[i][k] + matrix[k][j]);

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? // 打印floyd最短路徑的結(jié)果

? ? System.out.printf("最短路徑矩陣: \n");

? ? for (int i = 0; i < matrix.length; i++) {

? ? ? ? for (int j = 0; j < matrix.length; j++)

? ? ? ? ? ? System.out.printf("%3d? ", matrix[i][j]);

? ? ? ? System.out.printf("\n");

? ? }

}

public static void main(String[] args) {

? ? int[][] matrix = {

? ? ? ? ? ? {0, 5, 2, INF, INF, INF, INF},

? ? ? ? ? ? {5, 0, INF, 1, 6, INF, INF},

? ? ? ? ? ? {2, INF, 0, 6, INF, 8, INF},

? ? ? ? ? ? {INF, 1, 6, 0, 1, 2, INF},

? ? ? ? ? ? {INF, 6, INF, 1, 0, INF, 7},

? ? ? ? ? ? {INF, INF, 8, 2, INF, 0, 3},

? ? ? ? ? ? {INF, INF, INF, INF, 7, 3, 0}

? ? };

? ? floyd(matrix);

}

【END】

原文鏈接https://mp.weixin.qq.com/s/HIeA8Cg4-lEodmH9mIFCRQ

讀后感:通常少办,我們習(xí)慣于在已有的知識(shí)范圍內(nèi)去尋找問(wèn)題的解決方法。這個(gè)思路一般來(lái)說(shuō)是沒(méi)錯(cuò)的诵原,但隨著科技的進(jìn)步英妓,今天也許就有比昨天效率更高的方案可以采用。對(duì)于快節(jié)奏的現(xiàn)代生活來(lái)說(shuō)绍赛,效率就等同于效益蔓纠,你能提供越高效的方案,就能給企業(yè)帶來(lái)越高額的利益吗蚌。沒(méi)有了利益腿倚,企業(yè)就生存不下去,如果你不能為企業(yè)的生存和發(fā)展做出比別人更高的貢獻(xiàn)蚯妇,企業(yè)自然不會(huì)選擇你敷燎。所以暂筝,為了生存和發(fā)展的需要,我們要每天學(xué)習(xí)新知識(shí)硬贯,提升自我價(jià)值焕襟。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饭豹,隨后出現(xiàn)的幾起案子鸵赖,更是在濱河造成了極大的恐慌,老刑警劉巖墨状,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卫漫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肾砂,警方通過(guò)查閱死者的電腦和手機(jī)列赎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镐确,“玉大人包吝,你說(shuō)我怎么就攤上這事≡春” “怎么了诗越?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)息堂。 經(jīng)常有香客問(wèn)我嚷狞,道長(zhǎng),這世上最難降的妖魔是什么荣堰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任床未,我火速辦了婚禮,結(jié)果婚禮上振坚,老公的妹妹穿的比我還像新娘薇搁。我一直安慰自己,他們只是感情好渡八,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布啃洋。 她就那樣靜靜地躺著,像睡著了一般屎鳍。 火紅的嫁衣襯著肌膚如雪宏娄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天逮壁,我揣著相機(jī)與錄音绝编,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛十饥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祖乳,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逗堵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了眷昆?” 一聲冷哼從身側(cè)響起蜒秤,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亚斋,沒(méi)想到半個(gè)月后作媚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帅刊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年纸泡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赖瞒。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡女揭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出栏饮,到底是詐尸還是另有隱情吧兔,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布袍嬉,位于F島的核電站境蔼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伺通。R本人自食惡果不足惜箍土,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泵殴。 院中可真熱鬧涮帘,春花似錦、人聲如沸笑诅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吆你。三九已至弦叶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妇多,已是汗流浹背伤哺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人立莉。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓绢彤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蜓耻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茫舶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容