目錄
最小生成樹演算法複習
1.prim演算法
演算法描述
2.kruskal 演算法
演算法描述
求最小生成樹是資料結構中圖的一種重要應用,乙個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。
而求最小生成樹有兩種演算法,一種是prim演算法,一種是kruskal演算法。
prim 演算法求最小生成樹,它的要求是從乙個帶權無向完全圖中選擇 n-1 條邊並使這個圖仍然連通 (也即得到了一棵生成樹 ),同時還要考慮使樹的權最小。
prim演算法的適用範圍:mst(minimum spanning tree,最小生成樹), 無向圖(有向圖的是最小樹形圖), 多用於稠密圖(點少邊多) 。
(1)輸入:乙個加權連通圖,其中頂點集合為v,邊集合為e;
(2)初始化:vnew = ,其中x為集合v中的任一節點(起始點),enew = {},為空;
(3)在集合e中選取權值最小的邊,其中u為集合vnew中的元素,而v不在vnew集合當中,並且v∈v(如果存在有多條滿足前述條件即具有相同權值的邊,則可任意選取其中之一);
(4)將v加入集合vnew中,將邊加入集合enew中;
(5)如果vnew = v,結束,否則回到(3)。
用通俗話說一遍就是,從邊集合裡依次選權值最小、乙個端點在新點集中乙個端點在剩下的原集合中、的邊加入新的邊集,直到所有點都在新的點集中。新點集合新邊集即為輸出的最小生成樹。
根據演算法描述,乙個常規的思路是每次都對頂點集vnew中點的所有對應邊進行排序,然後選取權值最小的邊,這樣很容易得到演算法複雜度為o(e^2),我們可以維護乙個小根堆,新點集中每加入乙個新點,就將新點對應的邊權值放入邊中,這樣時間複雜度就可以降到o(eloge)。
kruskal演算法每次選擇 n- 1 條邊,所使用的貪婪準則是:從剩下的邊中選擇一條不會產生環路的具有最小耗費的邊加入已選擇的邊的集合中。注意到所選取的邊若產生環路則不可能形成一棵生成樹。kruskal演算法分 e 步,其中 e 是網路中邊的數目。按耗費遞增的順序來考慮這 e 條邊,每次考慮一條邊。當考慮某條邊時,若將其加入到已選邊的集合中會出現環路,則將其拋棄,否則,將它選入。
適用範圍:mst(minimum spanning tree,最小生成樹), 無向圖(有向圖的是最小樹形圖), 多用於稀疏圖(點多邊少) ,邊已經按權值排好序給出。
(1)記graph中有v個頂點,e條邊;
(2)新建圖graphnew,graphnew中擁有原圖中相同的e個頂點,但沒有邊;
(3)將原圖graph中所有e個邊按權值從小到大排序;
(4)迴圈:從權值最小的邊開始遍歷每條邊,如果這條邊連線的兩個節點於圖graphnew中不在同乙個連通分量中(不連通), 新增這條邊到圖graphnew中,直至圖graph中所有的節點都在同乙個連通分量中(都連通)。
最小生成樹演算法
由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...
最小生成樹演算法
乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...
演算法 最小生成樹
前言 最小生成樹是在乙個給定的無向圖中求一棵樹,這棵樹包含無向圖中的所有頂點,且樹中的邊都來自無向圖中的邊,並且要滿足整棵樹的邊權之和最小。1 最小生成樹是樹,其邊數等於頂點數減1,且不會有環 2 對於給定的圖最小生成樹可以不唯一,但是邊權之和一定是唯一的。3 其根節點可以是這棵樹上的任何乙個節點,...