態度與成果,是贏得話語權的最好方式。
最小生成樹顧名思義,首先是一棵樹,而「最小」的含義是指其邊長之和最小,其常用演算法有prim(普里姆)演算法和kruskal(克魯斯卡爾)演算法兩種。那麼,最小生成樹能解決什麼問題?這兩種演算法分別是如何實現的?
我們不妨從實際問題開始著手:在n個城市之間鋪設光纜,城市間鋪設光纜的費用各不相同,現要求任意兩個城市可以通訊,求鋪設光纜的最小花費。
根據題目描述,我們可以將城市作為節點,城市間以邊相連,光纜鋪設費用則為邊長,構成無向圖。求最小鋪設費用即等價於求出這張無向圖的最小生成樹。現假設有a、b、c、d共4個城市,城市間光纜鋪設費用分別為ab = 8,ac = 1,ad = 6,bc = 3,bd = 2,cd = 5。下面分別講一下prim和kruskal這兩種演算法的實現思路。
prim演算法該演算法可以從任意節點開始建樹。一句話概括其演算法思想為:從原點開始,每次新增與當前最小生成樹相連且不成環的最短邊,直到新增所有節點為止。這裡我們從a節點開始推進演算法,步驟如下圖所示:
以a為最初的最小生成樹開始,首先新增與之相連不成環且最短的ac邊,然後按規則依次新增bc、bd邊,所有節點均已新增,因此演算法結束,最小花費為1 + 3 + 2 = 6。一般情況下,prim演算法的時間複雜度為o(v^2)。
kruskal演算法一句話概括該演算法的基本思想為:每次從待選邊集中選出與當前森林不成環且最短的邊加入森林,直到所有節點形成一顆樹為止。該思想決定了kruskal演算法只能從最小的邊開始建樹,演算法推進步驟如下圖所示:
從最短的ac邊開始建樹,首先將ac邊加入森林,然後按規則依次加入bd、bc邊,所有節點已構成一棵樹,因此演算法結束,最小花費同樣為1 + 2 + 3 = 6。這裡需要用到排序,一般情況下我們使用快排,因此kruskal演算法的時間複雜度為o(eloge)。
值得一提的是,稠密圖(邊數較多)適合用prim演算法,而稀疏圖則適合用kruskal演算法。敬請期待下節內容。
最小生成樹基礎演算法
prim演算法求最小生成樹 與dijkstra演算法類似,dijkstra演算法是計算乙個節點到其他節點的最短路,prim演算法是需要維護節點到乙個集合的距離最小值,優化方式也是類似的,只需要用堆來維護距離即可 include using namespace std const int n 510,...
演算法總結篇 最小生成樹
目錄算是最後幾個完成這一章節學習的了,有很多思想和技巧都很好,需要好好學習 主要涉及兩個演算法 prim 演算法和 kruskal 演算法 感謝lsp為本文訂正做出的貢獻!先跑一遍 dij 求出 d i 再遍歷每個點,統計有幾種修建方案 然後根據乘法原理,求出所有方案數即可 感覺和最小生成樹沒半毛錢...
最小生成樹基礎
0.1 本文總結於 資料結構與演算法分析,源 均為原創,旨在 review 最小生成樹的基礎知識 0.2 了解本文的內容是 分析prim演算法 普利姆演算法 和 kruskal演算法 克魯斯卡爾演算法 的前提 1.1 我們考慮的問題 在乙個無向圖中找出一顆最小生成樹。乙個無向圖g的最小生成樹就是由該...