本文将给出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;
}
}
}