【圖】Kruskal算法簡述

本文將給出Kruskal算法思想簡要概述及核心代碼。

  • Kruskal算法思想簡要概述

假設 WN=(V,{E}) 是一個含有 n 個頂點的連通網,則按照克魯斯卡爾算法構造最小生成樹的過程爲:先構造一個只含 n 個頂點,而邊集爲空的子圖,若將該子圖中各個頂點看成是各棵樹上的根節點,則它是一個含有 n 棵樹的一個森林。之後,從網的邊集 E 中選取一條權值最小的邊,若該條邊的兩個頂點分屬不同的樹,則將其加入子圖,也就是說,將這兩個頂點分別所在的兩棵樹合成一棵樹;反之,若該條邊的兩個頂點已落在同一棵樹上,則不可取,而應該取下一條權值最小的邊再試之。依次類推,直至森林中只有一棵樹,也即子圖中含有 n-1條邊爲止。

  • 核心代碼實現
//kruskal
typedef struct{
	int start;//初始點 
	int end;//終點 
	int weight;//權重 
}Road; 
Road road[maxsize];
int getRoot(int a){			//並查集 
	while(a!=v[a])  a=v[a];
	return a;
}
void Kruskal(Graph G){
	int minsumcost=0;
	for(int i=0;i<G.arcnum;i++){
		v[i]=i;			//初始化 
	}
	sort(road,G.e);
	for(int i=0;i<g.vexnum;i++){
		int start=getRoot(road[i].start);
		int end=getRoot(road[i].end);
		//該邊連接兩個連通分支 
		if(start!=end){
			v[start]=end;
			minsumcost+=road[i].weight;
		}
	}	
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章