kruskal演算法是在處理乙個森林——樹的集合。開始時將圖的每個頂點看做一棵樹(集合),然後採用貪婪策略,每次從所有邊中依次選出(find)權值最小的邊,當改邊的兩個端點不在同一集合時,則將終點所在集合與起點集合合併(union),直到依次處理完所有的邊,演算法終止,此時所有的頂點在乙個樹中,即為最小生成樹。
圖一:初始時刻,所有頂點在各自集合中
圖二:選擇最小權值邊ad,將集合a與集合d合併
圖三:選擇邊ce,將集合c與集合e合併
圖四:選擇邊be,將集合abdf與集合ec合併
圖五:選擇邊eg,將集合g與集合abcdef合併。完成,所有點在同一集合中
實現**:
#include #include #define inf 0x7fffffff
struct graph
;struct edge
;//將邊按權值從小到大進行堆排序
void heapsort(struct edge* e);
int kruskal(graph g,int n)
{ int i,j,sum=0;
int* vset=(int*)malloc(n*sizeof(int));//標識每個頂點所屬的集合
struct edge* e=(struct edge*)malloc((n-1)*sizeof(edge));//邊陣列
for(i=0;i
最小生成樹(MST) Kruskal演算法
kruskal演算法主要對邊進行貪心,經過變換還可以求最大生成樹,還可以記錄樹的具體路徑。初始狀態時隱去圖中所有邊,這樣圖中每個頂點都自成乙個連通塊。對所有邊權從小到大排序。按邊權從小到大測試所有邊,如果當前測試邊所連線的兩個結點不在同乙個連通塊中,則把這條測試邊加入最小生成樹中 合併兩個連通塊 否...
最小生成樹(MST,kruskal演算法)
最小生成樹,對於乙個無向圖,聯通且不含圈的圖稱為樹。給定無向圖g v,e 連線g中所有點,且邊集是e的子集的數稱為g的生成樹 spanning tree 而權值最小的生成樹稱為最小生成樹 minimal spanning tree,mst 構造mst的演算法有很多,最常見的有兩個 kruskal演算...
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...