C 資料結構之最小生成樹

2021-06-18 11:17:05 字數 1478 閱讀 3116

最小生成樹是圖的一部分,一般求最小生成樹用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 為一無向連通...