最小生成樹與最短路徑的區別以及實現方法

最小生成樹與最短路徑的區別以及實現方法

轉載地址https://blog.csdn.net/yahohi/article/details/6989646

2011年11月18日 20:55:15

閱讀數:17105


一 區別
最小生成樹能夠保證整個拓撲圖的所有路徑之和最小,但不能保證任意兩點之間是最短路徑。
最短路徑是從一點出發,到達目的地的路徑最小。
二 實現方法
1. 最小生成樹
最小生成樹有兩種算法來得到:Prims算法和Kruskal算法。
Kruskal算法:根據邊的加權值以遞增的方式,一次找出加權值最低的邊來構建最小生成樹,而且規定:每次添加的邊不能造成生成樹有迴路,知道找到N-1個邊爲止。
Prims算法:以每次加入一個的臨界邊來建立最小生成樹,直到找到N-1個邊爲止。其規則爲:以開始時生成樹的集合(集合U)爲起始的定點,然後找出與生成樹集合鄰接的邊(集合V)中,加權值最小的邊來建立生成樹,爲了確定新加入的邊不會造成迴路,所以每一個新加入的邊,只允許有一個頂點在生成樹集合中,重複執行此步驟,直到找到N-1個邊爲止。

2 最短路徑

算法描述

  (這裏描述的是從節點1開始到各點的dijkstra算法,其中Wa->b表示a->b的邊的權值,d(i)即爲最短路徑值)  1. 置集合S={2,3,...n}, 數組d(1)=0, d(i)=W1->i(1,i之間存在邊) or +無窮大(1.i之間不存在邊)  2. 在S中,令d(j)=min{d(i),i屬於S},令S=S-{j},若S爲空集則算法結束,否則轉3  3. 對全部i屬於S,如果存在邊j->i,那麼置d(i)=min{d(i), d(j)+Wj->i},轉2  Dijkstra算法思想爲:設G=(V,E)是一個帶權有向圖,把圖中頂點集合V分成兩組,第一組爲已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以後每求得一條最短路徑 , 就將 加入到集合S中,直到全部頂點都加入到S中,算法就結束了),第二組爲其餘未確定最短路徑的頂點集合(用U表示),按最短路徑長度的遞增次序依次把第二組的頂點加入S中。在加入的過程中,總保持從源點v到S中各頂點的最短路徑長度不大於從源點v到U中任何頂點的最短路徑長度。此外,每個頂點對應一個距離,S中的頂點的距離就是從v到此頂點的最短路徑長度,U中的頂點的距離,是從v到此頂點只包括S中的頂點爲中間頂點的當前最短路徑長度。  算法具體步驟   (1)初始時,S只包含源點,即S=,v的距離爲0。U包含除v外的其他頂點,U中頂點u距離爲邊上的權(若v與u有邊)或 (若u不是v的出邊鄰接點)。  (2)從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。  (3)以k爲新考慮的中間點,修改U中各頂點的距離;若從源點v到頂點u(u U)的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值爲頂點k的距離加上邊上的權。  (4)重複步驟(2)和(3)直到所有頂點都包含在S中。

複雜度分析

  Dijkstra 算法的時間複雜度爲O(n^2)  空間複雜度取決於存儲方式,鄰接矩陣爲O(n^2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章