日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Floyd-傻子也能看懂的弗洛伊德算法

發布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Floyd-傻子也能看懂的弗洛伊德算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

? ? ? ?

?

暑假,小哼準備去一些城市旅游。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。

?

?

? ?? ???上圖中有4個城市8條公路,公路上的數字表示這條公路的長短。請注意這些公路是單向的。我們現在需要求任意兩個城市之間的最短路程,也就是求任意兩個點之間的最短路徑。這個問題這也被稱為“多源最短路徑”問題。

?

? ? ? ? 現在需要一個數據結構來存儲圖的信息,我們仍然可以用一個4*4的矩陣(二維數組e)來存儲。比如1號城市到2號城市的路程為2,則設e[1][2]的值為2。2號城市無法到達4號城市,則設置e[2][4]的值為∞。另外此處約定一個城市自己是到自己的也是0,例如e[1][1]為0,具體如下。

? ? ? ??現在回到問題:如何求任意兩點之間最短路徑呢?通過之前的學習我們知道通過深度或廣度優先搜索可以求出兩點之間的最短路徑。所以進行n2遍深度或廣度優先搜索,即對每兩個點都進行一次深度或廣度優先搜索,便可以求得任意兩點之間的最短路徑。可是還有沒有別的方法呢?

?

? ?? ???我們來想一想,根據我們以往的經驗,如果要讓任意兩點(例如從頂點a點到頂點b)之間的路程變短,只能引入第三個點(頂點k),并通過這個頂點k中轉即a->k->b,才可能縮短原來從頂點a點到頂點b的路程。那么這個中轉的頂點k是1~n中的哪個點呢?甚至有時候不只通過一個點,而是經過兩個點或者更多點中轉會更短,即a->k1->k2b->或者a->k1->k2…->k->i…->b。比如上圖中從4號城市到3號城市(4->3)的路程e[4][3]原本是12。如果只通過1號城市中轉(4->1->3),路程將縮短為11(e[4][1]+e[1][3]=5+6=11)。其實1號城市到3號城市也可以通過2號城市中轉,使得1號到3號城市的路程縮短為5(e[1][2]+e[2][3]=2+3=5)。所以如果同時經過1號和2號兩個城市中轉的話,從4號城市到3號城市的路程會進一步縮短為10。通過這個的例子,我們發現每個頂點都有可能使得另外兩個頂點之間的路程變短。好,下面我們將這個問題一般化。

?

? ?? ???當任意兩點之間不允許經過第三個點時,這些城市之間最短路程就是初始路程,如下。

? ? ? ?

?

?

假如現在只允許經過1號頂點,求任意兩點之間的最短路程,應該如何求呢?只需判斷e[i][1]+e[1][j]是否比e[i][j]要小即可。e[i][j]表示的是從i號頂點到j號頂點之間的路程。e[i][1]+e[1][j]表示的是從i號頂點先到1號頂點,再從1號頂點到j號頂點的路程之和。其中i是1~n循環,j也是1~n循環,代碼實現如下。

for (i = 1; i <= n; i++) {for (j = 1; j <= n; j++){if (e[i][j] > e[i][1] + e[1][j])e[i][j] = e[i][1] + e[1][j];} }

在只允許經過1號頂點的情況下,任意兩點之間的最短路程更新為:

?

? ?? ???通過上圖我們發現:在只通過1號頂點中轉的情況下,3號頂點到2號頂點(e[3][2])、4號頂點到2號頂點(e[4][2])以及4號頂點到3號頂點(e[4][3])的路程都變短了。

?

? ?? ???接下來繼續求在只允許經過1和2號兩個頂點的情況下任意兩點之間的最短路程。如何做呢?我們需要在只允許經過1號頂點時任意兩點的最短路程的結果下,再判斷如果經過2號頂點是否可以使得i號頂點到j號頂點之間的路程變得更短。即判斷e[i][2]+e[2][j]是否比e[i][j]要小,代碼實現為如下。

//經過1號頂點 for(i=1;i<=n;i++)for(j=1;j<=n;j++)if (e[i][j] > e[i][1]+e[1][j]) e[i][j]=e[i][1]+e[1][j]; //經過2號頂點 for(i=1;i<=n;i++)for(j=1;j<=n;j++)if (e[i][j] > e[i][2]+e[2][j]) e[i][j]=e[i][2]+e[2][j];

在只允許經過1和2號頂點的情況下,任意兩點之間的最短路程更新為:

? ?? ???通過上圖得知,在相比只允許通過1號頂點進行中轉的情況下,這里允許通過1和2號頂點進行中轉,使得e[1][3]和e[4][3]的路程變得更短了。

?

? ?? ???同理,繼續在只允許經過1、2和3號頂點進行中轉的情況下,求任意兩點之間的最短路程。任意兩點之間的最短路程更新為:

? ?? ???最后允許通過所有頂點作為中轉,任意兩點之間最終的最短路程為:

? ?? ???整個算法過程雖然說起來很麻煩,但是代碼實現卻非常簡單,核心代碼只有五行:

for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(e[i][j]>e[i][k]+e[k][j])e[i][j]=e[i][k]+e[k][j];

這段代碼的基本思想就是:最開始只允許經過1號頂點進行中轉,接下來只允許經過1和2號頂點進行中轉……允許經過1~n號所有頂點進行中轉,求任意兩點之間的最短路程。用一句話概括就是:從i號頂點到j號頂點只經過前k號點的最短路程。

#include int main() {int e[10][10],k,i,j,n,m,t1,t2,t3;int inf=99999999; //用inf(infinity的縮寫)存儲一個我們認為的正無窮值//讀入n和m,n表示頂點個數,m表示邊的條數scanf("%d %d",&n,&m);//初始化for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i==j) e[i][j]=0;else e[i][j]=inf;//讀入邊for(i=1;i<=m;i++){scanf("%d %d %d",&t1,&t2,&t3);e[t1][t2]=t3;}//Floyd-Warshall算法核心語句for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(e[i][j]>e[i][k]+e[k][j] )e[i][j]=e[i][k]+e[k][j];//輸出最終的結果for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%10d",e[i][j]);printf("\n");}return 0; }

? ?? ???另外需要注意的是:Floyd-Warshall算法不能解決帶有“負權回路”(或者叫“負權環”)的圖,因為帶有“負權回路”的圖沒有最短路。例如下面這個圖就不存在1號頂點到3號頂點的最短路徑。因為1->2->3->1->2->3->…->1->2->3這樣路徑中,每繞一次1->-2>3這樣的環,最短路就會減少1,永遠找不到最短路。其實如果一個圖中帶有“負權回路”那么這個圖則沒有最短路。

迪杰斯特拉算法要求所有邊的權值均非負,弗洛伊德算法允許圖中有帶負權值的邊,但不允許有包含帶負權值的邊組成的回路。

總結

以上是生活随笔為你收集整理的Floyd-傻子也能看懂的弗洛伊德算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久亚洲av无码专区桃色 | 在线看的免费网站 | 欧美激情视频在线 | 蜜臀视频一区二区三区 | 亚洲日本色 | www.com捏胸挤出奶 | 91天堂网| 日日射视频 | 亚洲a网| 免费观看日本 | 狂野少女电影在线观看国语版免费 | 久草最新视频 | 姝姝窝人体www聚色窝 | 国产精品久热 | jizz中国少妇 | 国产精品久久777777毛茸茸 | av中文字幕不卡 | 高h1v | 久久久久久久久久久久国产精品 | 被警察猛c猛男男男 | 成人性做爰aaa片免费看不忠 | 伊人日本 | 蜜桃视频色 | 梦梦电影免费高清在线观看 | 极品少妇在线 | 操网站 | 天堂网在线最新版www中文网 | 中文字幕一区二区人妻电影丶 | 日本韩国视频 | 黄色片久久久久 | 中国女人真人一级毛片 | 亚洲永久精品视频 | 香蕉免费在线视频 | av自拍网| 国产成人精品av在线观 | 懂色一区二区二区av免费观看 | 欧美极品在线视频 | 日韩在线二区 | 中文字幕av一区二区三区谷原希美 | 欧美性受xxx黑人xyx性爽 | 国产视频一区二区 | 精品国产人妻一区二区三区 | 91精品国产综合久久久密臀九色 | 欧美天堂在线视频 | 国产黄色三级网站 | 精品人妻一区二区三区日产 | 禁漫天堂下载18 | 日本99热| 日本三级中文字幕在线观看 | 谁有免费黄色网址 | 欧美视频免费看欧美视频 | 亚洲狠狠爱 | 日本一区久久 | 91免费网站在线观看 | 久久国产色av | 日本在线免费播放 | 在线一级| 夜夜嗨影院 | 青青色在线| 国产毛片a | 国产剧情久久久 | 日本午夜一区 | 泰坦尼克号3小时49分的观看方法 | 日韩三区四区 | 亚州av网站| 欧美日本国产在线 | 日韩久久免费视频 | 欧美一级片免费在线观看 | 成人毛片a | 九七精品 | h视频国产| 中文字幕你懂的 | 中文字幕在线视频免费观看 | 一区二区视频在线观看 | 夫妻性生活黄色大片 | 久久成人免费视频 | 亚洲免费在线视频观看 | 蜜桃传媒一区二区亚洲 | av高清一区二区 | 葵司ssni-879在线播放 | 天堂在线观看中文字幕 | 在线免费视频一区 | 毛片视频免费观看 | av网站入口| 动漫美女被艹 | 4438五月天 | 毛毛毛片 | 成人欧美视频在线观看 | 国产黄色一级片 | 国内老熟妇对白hdxxxx | 国产精品综合在线 | 毛片内射 | 免费人成 | 天天干国产 | 天堂在线1 | 精品一区二区三区在线播放 | 日韩在线观看视频一区二区 | 91官网在线| 天堂网www|