最小生成樹是圖的一部分,一般求最小生成樹用prim演算法和kruskal演算法。
對於prim演算法,思想是:在訪問過的頂點和未訪問的頂點之間選擇權值最小的邊。prim演算法是基於頂點的操作,適合於頂點較少,邊較多的圖。
對於kruskal演算法,思想是:直接從圖中選擇權值最小的邊,並且已選擇的邊不能構成連通圖。kruskal演算法是基於邊的操作,適合於邊較少,頂點較多的圖。
prim演算法,在此我用了關聯容器pair作為邊的儲存結構:
//普里姆演算法
int prim(const int g[vnum], vector> &edge)}}
} w += g[v][u];
visited[u] = 1;
edge[number-1].first = v;
edge[number-1].second = u;
} return w;
}
克魯斯卡爾演算法的最小生成樹結構用並查集表示,並查集在次主要用來判斷已選擇的邊是否構成連通圖,如果對應頂點x,y的findroot()操作返回的結果相同,即他們的根相同,則能夠成連通圖,說明選擇的邊不滿足條件。
//並查集結構
class disjointset
int findroot(int x)
void union(int x, int y) };
//kruskal
int kruskal(const int g[vnum], vector> &edge)
}} w += g[u][v];
v.union(u, v);
edge[num].first = v;
edge[num].second = u;
} return w;
}
下面是主程式:
/*************************
date : 2013-9-20
author : ***0423
function: 無向圖的最小生成樹
******************&******/
#include #include #include using namespace std;
const int m = 10; //兩節點無邊權值用m表示
const int vnum = 6;
int prim(const int g[vnum], vector> &edge);
int kruskal(const int g[vnum], vector> &edge);
int main()
; vector> edge(vnum-1);
//prim
cout<
輸出結果如下:
資料結構之最小生成樹
最小生成樹 乙個連通圖的生成樹是乙個極小連通子圖,它含有圖中全部頂點,但只有足以構成一棵樹的n 1條邊。這種構造連通網的最小代價生成樹稱為最小生成樹,詳見資料結構之圖 術語 儲存結構 遍歷 求連通網的最小生成樹有兩種經典方法 普里姆 prime 演算法和克魯斯卡爾 kruskal 演算法。假設n v...
資料結構 最小生成樹
生成樹 乙個連通圖的最小連通子圖稱作該圖的生成樹。有n個結點的連通圖的生成樹有n個結點和n 1條邊。乙個有n個結點的連通圖的生成樹是原圖的極小連通子圖,它包含原圖中的所有n個結點,並且有保持圖連通的最少的邊。由生成樹的定義可知 若在生成樹中刪除一條邊,就會使該生成樹因變成非連通圖而不再滿足生成樹的定...
資料結構(最小生成樹)
對於乙個無相連通網,他的所有生成樹中必有一棵邊的權值總和最小的生成樹,稱之為最小代價生成樹,簡稱最小生成樹。最小生成樹必須滿足三個條件 1 構造的最小生成樹必須包括n個頂點 2 構造的最小生成樹有且僅有n 1條邊 3 構造的最小生成樹中不存在迴路。普利姆演算法 prim 假設g v,e 為一無向連通...