最小生成樹( 克魯斯卡爾演算法)

2021-06-27 09:06:34 字數 1548 閱讀 9883

/*

name:

author:

date: 01-12-14 20:17

description: 最小生成樹( 克魯斯卡爾演算法)

關於並查集的演算法,參見《一種簡單而有趣的資料結構——並查集》

*/#include#include#define maxn 1000 //最大頂點數量

#define max 20000 //最大邊數量

#define infinity 999999 //無窮大

int map[max][max] = ;//鄰接矩陣儲存圖資訊

typedef struct edgenode edgenode;

void creatgraph(edgenode *e, int m);//建立三元組邊表集圖

void creatgraph_2(edgenode *e, int m, int n);//建立鄰接矩陣圖(隨機圖)

int locate(edgenode *e, int n, int u, int v);//判斷u,v是否是鄰接點

void printgraph(edgenode *e, int m);//輸出圖

int cmp (const void *a , const void *b);//快排的配套函式

int findfatherandreducepath(int father, int pos);//查詢族長並壓縮路徑:找到族長後,將所途經的前輩結點均指向族長

int unionbysize(int father, int posi, int posj);//按大小求並:將成員posi和posj合併到同乙個家族

void krsl(edgenode *e, int m, int n);//克魯斯卡爾演算法求最小生成樹

int main()

void creatgraph(edgenode *e, int m)//建立三元組邊表集圖

printf("\n");

} int cmp (const void *a , const void *b)//快排的配套函式

void krsl(edgenode *e, int m, int n)//克魯斯卡爾演算法求最小生成樹

; edgenode mintree[maxn] = ;

for (i=0; i= %d\t", mintree[i].u, mintree[i].v, mintree[i].w);

min += mintree[i].w;

}

printf("\n最小生成樹總長度(權值)為 %d\n", min);

} int findfatherandreducepath(int father, int pos)//查詢族長並壓縮路徑:找到族長後,將所途經的前輩結點均指向族長

int unionbysize(int father, int posi, int posj)//按大小求並:將成員posi和posj合併到同乙個家族

else //否則fj當族長

return 1;

}

最小生成樹 克魯斯卡爾演算法

c node.h檔案 儲存頂點資訊 class c node c node c node c node p node c node c node c node c node char p data node.h檔案,儲存邊資訊 include class link node link node li...

最小生成樹 克魯斯卡爾演算法

之前學了用普里姆演算法來求最小生成樹的權值和,但是它的時間複雜度為o v2 使用優先順序佇列優化後,可以優化為o e log v 克魯斯卡爾演算法可以在o e log e 的時間複雜度內,求出最小生成樹 克魯斯卡爾演算法的核心就是對邊進行公升序排序,然後從權值最小的邊開始,加入最小生成樹中,然後利用...

克魯斯卡爾演算法生成最小生成樹

以c為起點為例 1 找到最短的邊 2 判斷是否可以連通 兩個點出自不同的通區域 3 重複第二步 最後將所有點都 直接或者間接 連通成功 上面就是克魯斯卡爾演算法的基本思路。如何用 實現呢,往下看。public class mapnode 克魯斯卡爾演算法 public static void kru...