[
功能模組]
/*kruskal
演算法的設計與實現
(win-tc除錯通過)*/
#include "stdio.h"
#include "conio.h"
#define max 30
typedef struct
edge;
typedef struct
graph;
typedef struct node
alist;
void heapadjust(edge data,int s ,int m)
data[s]=t; /*將備份元素插入由s所指出的位置*/
}int creatgraph(graph *p) /*輸入圖的頂點數和邊數,建立乙個圖並返回圖的邊數*/
return m;
}int kruskal(graph g,int enumber,int tree[3]) /*用kruskal演算法求圖g的最小生成樹,返回其代價*/
for(i=enumber-1;i>=0;i--) /*按邊上的權值建立小根堆*/
heapadjust(g.e,i,enumber-1);
k=g.vnum; /*k用於計算圖中連通分量的數目*/
m=enumber-1;
i=0;
doif(!p) /*如果不在同乙個連通分量中*/
k--; /*連通分量數目減少乙個*/
tree[i][0]=v1; /*加入最小生成樹中*/
tree[i][1]=v2;
tree[i][2]=g.e[0].weight;
cost+=g.e[0].weight;
i++;
}/*if*/
g.e[0]=g.e[m];
m--;
heapadjust(g.e,0,m); /*找下一條權值最小的邊*/
}while(k>1); /*當所有的頂點不在同乙個連通分量時,繼續迴圈*/
return cost;
}main()
{ int i,enumber,cost=0;
int tree[max][3];
graph g;
enumber=creatgraph(&g);
cost=kruskal(g,enumber,tree);
printf("/n輸出最小生成樹的邊集:/n");
for(i=0;i[
測試方案]
假設有以下無向連通圖:
用以上資料進行測試,程式的執行結果如下:
輸入圖的頂點數:
4
輸入圖的邊數:
6
輸入第1
條邊的頂點和權值:
1210
輸入第2
條邊的頂點和權值:
1375
輸入第3
條邊的頂點和權值:
1420
輸入第4
條邊的頂點和權值:
2385
輸入第5
條邊的頂點和權值:
2440
輸入第6
條邊的頂點和權值:
3435
輸出最小生成樹的邊集:
1210
1420
3435
最小生成樹的成本為:
65
由程式的執行結果可以驗證所設計的演算法是正確的。
kruskal 演算法java實現
public class class kruskal,初始化graphic中點和點的距離,32767表示距離無窮大 另外乙個測試用例是 label new int list graph.length for int i 0 i label.length i 初始化標記 int j int label...
kruskal演算法(C 實現)
templatebool kruskal edgenodet next i,j,c 把邊放到最小堆 minheap h 1 h.initialize e,e,e unionfind u n k 0 while e k n 1 deactivatepos h.deactivate return k n...
Kruskal演算法(c 實現)
演算法原理 1.將邊的權值從小到大排列 2.構造輔助陣列root n n為節點個數 3.按照邊的權值從小到大的順序考察各條邊 4.關鍵 如何判別被考察邊的兩個頂點是否位於兩個連通分量 用到輔助函式 先將輔助函式各項初始化為 1,如果root i 為 1 則頂點就為該連通分量的 跟 對於邊 u,v 設...