via:
/克魯斯卡爾演算法
//在連通網中求出最小生成樹
#include #include #define maxedge 20
#define maxvex 20
#define infinity 65535
typedef struct
mgraph;
typedef struct
edge; //對邊集陣列edge結構的定義
//建立圖的鄰接矩陣
void createmgraph(mgraph *g)
}g->arc[0][1]=7;
g->arc[0][3]=5;
g->arc[1][2]=8;
g->arc[1][3]=9;
g->arc[1][4]=7;
g->arc[2][4]=5;
g->arc[3][4]=15;
g->arc[3][5]=6;
g->arc[4][5]=8;
g->arc[4][6]=9;
g->arc[5][6]=11;
for(i = 0; i < g->numvertexes; i++)
} }//快速排序的條件
int cmp(const void* a, const void* b)
//找到根節點
int find(int *parent, int f)
return f;}
// 生成最小生成樹
void minispantree_kruskal(mgraph g) }}
//為邊集陣列edge排序
qsort(edges, g.numedges, sizeof(edge), cmp);
for (i = 0; i < g.numvertexes; i++)
parent[i] = 0;
printf("列印最小生成樹:\n");
克魯斯卡爾演算法
測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 n 村莊數目m 100 隨後的 n 行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本 也是正整數 為簡單起見,村莊從1到m編號。當n為0時,全部輸入結束,相應的結果不要輸出。對每個測試用例,在...
克魯斯卡爾演算法
設n v,是連通網 1 令最小生成樹的初始狀態為只有n個頂點而無邊的非連通圖t v,圖中每個頂點自成乙個連通分量 2 在e中選擇代價最小的邊,若該邊依附的頂點落在t中不同的連通分量上,則將此邊加入到t中,否則捨去此邊而選擇下一條代價最小的邊 3 反覆執行第2 步,直至t中所有頂點都在同一連通分量上為...
克魯斯卡爾演算法
克魯斯卡爾演算法也是用來尋找乙個圖的最小生成樹的演算法,與prim演算法相同的是,二者都採用由小及大的策略,逐步將整個圖的最小生成樹求出,但二者不同的地方在於prim演算法逐步歸併頂點,而克魯斯卡爾演算法則是逐步歸併邊。演算法思想 設聯通網路n 1 構造乙個只有n個頂點,沒有邊的非連通圖t 每個頂點...