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