图的最小生成树和最短路径算法思路总结(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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智界 S7 及华为全场景发布会官宣 11
- 下一篇: 二叉排序树(搜索树BST)-详解结点的删