本文將給出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;
}
}
}