**
給定乙個帶權的無向連通圖,如何選取一棵生成樹,使樹上所有邊上權的總和為最小,這叫最小生成樹.
求最小生成樹的演算法
(1) 克魯斯卡爾演算法
圖的存貯結構採用
邊集陣列
,且權值相等的邊在陣列中排列次序可以是任意的.
該方法對於邊相對比較多的不是很實用,浪費時間
.方法:將圖中邊按其權值由小到大的次序順序選取,若選邊後不形成迴路,則保留作為一條邊,若形成迴路則除去.依次選夠(n-1)條邊,即得最小生成樹,(n為頂點數)就是乙個貪心演算法;
kruskal適合
一維陣列
來管理資料 ;
第一步:由邊集陣列選第一條邊
第二步:選第二條邊,即權值為2的邊
第三步:選第三條邊,即權值為3的邊
第四步:選第四條邊,即權值為4的邊
第五步:選第五條邊
** introduction to algorithms
* chapter 23 -
-- mst.kruskal
* tanky woo @ www.wutianqi.com
* 2012.1.7*/
#include
#include
using namespace std;
const
int maxint = 999999;
typedef struct roadroad;
int no;
int line;
//記錄實際關係數
road road[100];/
/設乙個比較大的值,實際看輸入最小生成樹中:邊數e=n-1
int node[101];/
/最小生成樹:n頂點數
bool mycmp(
const road &a,
const road &b)
//node[2]
=1 node[8]
=1 ,node[3]
=1,共同的祖先,如果(3,8)加進去,則構成迴路,不要
//有點像並查集
int find_set(
int n)
bool merge(
int s1,
int s2)
int main(
)sort(road, road+line, mycmp)
;int sum = 0, count = 0;
// sum是mst的值,count是記錄已使用的點數
for(i=0; i
++i)
if(count =
= no-1)
//e=n-1已經連通,可以退出
break;
}cout <
return 0;}/
*input.txt:914
1 2 4
1 8 8
2 3 8
2 8 11
3 4 7
3 6 4
3 9 2
4 5 9
4 6 14
5 6 10
6 7 2
7 8 1
7 9 6
8 9 7*/
克魯斯卡爾演算法 Kruskal
克魯斯卡爾 kruskal 演算法是一種按權值的遞增次序選擇合適的邊來構造最小生成樹的方法。假設g v,e 是乙個具有 n 個頂點的帶權連通圖,t u,t e 是g 的最小生成樹,則構造最小生成樹的步驟如下 1 設定 u的初值等於 v 即包含有 g中的全部頂點 te 的初值為空集 即圖 t 中每乙個...
克魯斯卡爾 Kruskal 演算法
設g v,e 是具有n個頂點的連通網,t u,te 是其最小生成樹。初值 u v,te 對g中的邊按權值大小從小到大依次選取。選取權值最小的邊 vi,vj 若邊 vi,vj 加入到te後形成迴路,則捨棄該邊 邊 vi,vj 否則,將該邊併入到te中,即te te 重複 直到te中包含有n 1條邊為止...
克魯斯卡爾 Kruskal 演算法
1 克魯斯卡爾演算法使用來求加權連通圖的最小生成樹的演算法 2 基本思想 按照權值從小到大的順序選擇n 1條邊,並保證n 1條邊不構成迴路。3 具體做法 先將各路的權值按照從小到大排序,然後建立乙個最終點的陣列。通過最終點的陣列來實現不構成迴路。構建最小生成樹的節點 頂點 資訊。class edat...