普里姆算法,克魯斯卡爾算法,迪傑斯特拉算法,弗洛里德算法


做數據結構的課程設計順便總結一下這四大算法,本人小白學生一枚

如果總結的有什么錯誤,希望能夠告知指正

 

 

普里姆算法如圖所示prim

找出最短的邊,再以這條邊構成的整體去尋找與之相鄰的邊,直至連接所有頂點,生成最小生成樹,時間復雜度為O(n2)

克魯斯卡爾算法如圖所示kruskal

克魯斯卡爾算法,假設連通網N=(N,{E}),則令最小生成樹的初始狀態為只有n個頂點而無邊的非連通圖T=(V,{}),圖中每個頂點

自成一個連通分量。在E中選擇代價最小的邊,若該邊依附的定頂點落在T中不同的連通分量上,則將此邊加入到T中,否則社區次邊而選擇

下一條代價最小的邊。依次類推,直至T中所有的頂點都在同一連通分量上為止

 

 

迪傑斯特拉算法Dijkstra

迪傑斯特拉算法和普里姆算法有相似的地方但是也有區別,都是貪心算法,但是普里姆算法的源點是任意的

而迪傑斯特拉算法的源點是特定的,他們都是把頂點分成兩個集合

 

弗洛里德算法floyd

時間復雜度:O(n^3);

算法過程

編輯
1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權為無窮大。
2,對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比已知的路徑更短。如果是更新它。
把圖用鄰接矩陣G表示出來,如果從Vi到Vj有路可達,則G[i,j]=d,d表示該路的長度;否則G[i,j]=無窮大。定義一個矩陣D用來記錄所插入點的信息,D[i,j]表示從Vi到Vj需要經過的點,初始化D[i,j]=j。把各個頂點插入圖中,比較插點后的距離與原來的距離,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值變小,則D[i,j]=k。在G中包含有兩點之間最短道路的信息,而在D中則包含了最短通路徑的信息。
比如,要尋找從V5到V1的路徑。根據D,假如D(5,1)=3則說明從V5到V1經過V3,路徑為{V5,V3,V1},如果D(5,3)=3,說明V5與V3直接相連,如果D(3,1)=1,說明V3與V1直接相連。

弗洛里德算法是求加權圖中兩個頂點之間的最短路路徑,而迪傑斯特拉算法是求一個頂點到所有定點之間的距離

Floyd算法又稱為弗洛伊德算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的算法。
算法過程:1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,或者無窮大,如果兩點之間沒有邊相連。
2,對於每一對頂點u和v,看看是否存在一個頂點w使得從u到w再到v比己知的路徑更短。如果是更新它。
Dijkstra(迪傑斯特拉)算法是典型的單源最短路徑算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。
 
算法步驟如下:
  1.初使時令S={V0},T={其余頂點},T中頂點對應的距離值
  若存在,d(V0,Vi)為弧上的權值
  若不存在,d(V0,Vi)為∝
  2.從T中選取一個其距離值為最小的頂點W且不在S中,加入S
  3.對T中頂點的距離值進行修改:若加進W作中間頂點,從V0到Vi的
  距離值比不加W的路徑要短,則修改此距離值
  重復上述步驟2、3,直到S中包含所有頂點,即S=T為止

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM