最小生成树与最短路径的区别以及实现方法
生活随笔
收集整理的這篇文章主要介紹了
最小生成树与最短路径的区别以及实现方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、區別
最小生成樹能夠保證整個拓撲圖的所有路徑之和最小,但不能保證任意兩點之間是最短路徑。
最短路徑是從一點出發,到達目的地的路徑最小。
二、實現方法
最小生成樹有兩種算法來得到:Prims算法和Kruskal算法。
Kruskal算法:
根據邊的加權值以遞增的方式,一次找出加權值最低的邊來構建最小生成樹,而且規定:每次添加的邊不能造成生成樹有回路,知道找到N-1個邊為止。
Prims算法:
以每次加入一個的臨界邊來建立最小生成樹,直到找到N-1個邊為止。其規則為:以開始時生成樹的集合(集合U)為起始的定點,然后找出與生成樹集合鄰接的邊(集合V)中,加權值最小的邊來建立生成樹,為了確定新加入的邊不會造成回路,所以每一個新加入的邊,只允許有一個頂點在生成樹集合中,重復執行此步驟,直到找到N-1個邊為止。
算法描述
(這里描述的是從節點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)
原文鏈接:https://blog.csdn.net/yahohi/article/details/6989646
總結
以上是生活随笔為你收集整理的最小生成树与最短路径的区别以及实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021中国民营企业500强调研分析报告
- 下一篇: 最小生成树(Kruskal和Prim算法