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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)

發布時間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

帶權無向圖—>最小生成樹算法—>Prim算法:

思路:
首先,我們先設置兩個集合,U_{}:一個用來放最小生成樹的頂點,T_{}:一個用來放最小生成樹的邊。選取最開始的點V_0,將V_0放入U_{}中,得到U_{V_0},然后從V_0出發的邊中選權值最小的,把該邊的另外一個點加入集合U中,把邊加入集合T中,重復該操作,直到集合U中含圖的全部點,最小生成樹構造完畢。

代碼如下:
Prim

帶權無向圖—>最小生成樹算法—>Kruskal算法:

思路:
首先,我們先得到該圖的最小生成樹,只不過沒有邊,全部是點,然后按照邊的權值從小到大排序,然后開始從小到大選邊,只要不會讓目前的最小生成樹生成回路的邊就可以選,最后形成完整的最小生成樹。

代碼如下:
Kruskal

帶權有向圖—>最短路徑算法—>單源最短路徑算法—>Dijkstra算法:

思路:
首先,我們先設置兩個集合,U1_{}:一個用來放已找到最短路徑的頂點,U2_{}:一個用來放當前還未找到最短路徑的頂點。選取最開始的點V_0,將V_0放入U1_{}中,得到U1_{V_0},初始狀態,集合U1中只有V_0,然后從U2_{}不斷選取到V_0路徑長度最短的點,將該點放入集合U1_{},U1_{}每次放入新點,都要修改頂點V_0到集合U2_{}剩余頂點的最短路徑長度值,不斷重復該過程,直到集合U2_{}中的點全部放入集合U1_{}中。

代碼如下:
Dijkstra

帶權有向圖—>最短路徑算法—>每對頂點之間的最短路徑算法—>Floyd算法:

思路:
假設求從頂點vi到vj的最短路徑。如果從vi到vj有弧,則從vi到vj存在一條長度為arcs[i][j]的路徑,該路徑不一定是最短路徑,尚需進行n次試探。首先考慮路徑(vi, v0, vj)是否存在(判別弧(vi, v0)和(v0, vj)是否存在)。如果存在,則比較(vi, vj)和(vi, v0, vj)的路徑長度,取長度較短者為從vi到vj的中間頂點的序號不大于0的最短路徑。假如在路徑上再增加一個頂點v1,也就是說,如果(vi, …, v1)和(v1, …, vj)分別是當前找到的中間頂點的序號不大于0的最短路徑,那么(vi, …, v1, … , vj)就有可能是從vi到vj的中間頂點的序號不大于1的最短路徑。將它和已經得到的從vi到vj中間頂點序號不大于0的最短路徑相比較,從中選出中間頂點的序號不大于1的最短路徑之后,再增加一個頂點v2,繼續進行試探,依此類推。在一般情況下,若(vi, …, vk)和(vk, …, vj)分別是從vi到vk和從vk到vj的中間頂點的序號不大于k-1的最短路徑,則將(vi, …, vk, …, vj)和已經得到的從vi到vj且中間頂點序號不大于k-1的最短路徑相比較,其長度較短者便是從vi到vj的中間頂點的序號不大于k的最短路徑。這樣,在經過n次比較后,最后求得的必是從vi到vj的最短路徑。
按此方法,可以同時求得各對頂點間的最短路徑。

代碼如下:
Floyd

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)的全部內容,希望文章能夠幫你解決所遇到的問題。

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