Kruskal演算法的設計與實現

2021-04-06 20:13:08 字數 1783 閱讀 5877

[

功能模組]

/*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 設...