最小生成樹能夠保證整個拓撲圖的所有路徑之和最小
,但不能保證任意兩點之間是最短路徑。
最短路徑是從一點出發,到達目的地的路徑最小
。
最小生成樹
最小生成樹有兩種演算法來得到:prims演算法和kruskal演算法
。
kruskal演算法:
根據邊的加權值以遞增的方式,一次找出加權值最低的邊來構建最小生成樹,而且規定:每次新增的邊不能造成生成樹有迴路,知道找到n-1個邊為止。
prims演算法:
以每次加入乙個的臨界邊來建立最小生成樹,直到找到n-1個邊為止。其規則為:以開始時生成樹的集合(集合u)為起始的定點,然後找出與生成樹集合鄰接的邊(集合v)中,加權值最小的邊來建立生成樹,為了確定新加入的邊不會造成迴路,所以每乙個新加入的邊,只允許有乙個頂點在生成樹集合中,重複執行此步驟,直到找到n-1個邊為止。
最短路徑(dijkstra演算法、floyd演算法)
演算法描述
(這裡描述的是從節點1開始到各點的dijkstra演算法,其中wa->b表示a->b的邊的權值,d(i)即為最短路徑值)
1. 置集合s=, 陣列d(1)=0, d(i)=w1->i(1,i之間存在邊) or +無窮大(1.i之間不存在邊)
2. 在s中,令d(j)=min,令s=s-,若s為空集則演算法結束,否則轉3
3. 對全部i屬於s,如果存在邊j->i,那麼置d(i)=min,轉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)
最短路徑與最小生成樹
19.8.9 總結 上午深入理解floyd演算法 就是將每一點都遍歷過去 然後選最短的 先理解最短路徑的一種演算法 有點難搞 下午測試 基礎不太行 以前寫的也有些忘了 晚上學最小生成樹 一開始難以理解 但看了各種部落格後漸漸理解 最後思路逐漸清晰 prim演算法就是 先將起點加入生成樹 然後從起點開...
最短路徑 最小生成樹
題目描述 n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離 輸入描述 第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路 接下來m行兩個整數,表示相連的兩個城市的編號 輸出描述 n 1行,表示0號城市到其他城...
最短路徑 最小生成樹
今天覆習的時候,剛好複習的這一塊,所以就簡單做乙個備忘,寫的潦草還望大家不要介意呀 1 dijistra演算法 思路 根據點集合將其分為兩個集合,一種是已經訪問過的點s集合 代表從源點到該集合中的點的距離最小 另一種是未訪問過的u集合,然後每次從u集合中選擇節點,使得源點到改點的距離最小,並新增進s...