克鲁斯卡算法思想:
在无向图中按照边的权值从小到大排序,然后从最小边开始扫描,并且检测当前边是否为候选变,即是否该边会构成回路,如不构成,则将该边并入当前的生成树
typedef struct{
int a,b;
int weight;
}Road;
Road road[maxSize];
int v[maxSize]; //定义并查集数组
int getRoot(int a){ //在并查集中查找根节点的函数
if(a!v[a])
a = v[a];
return a;
}
void Kruskal(MGraph g, int &sum, Road road[]){
int i;
int N,E,a,b;
N = g.n;
E = g.e;
sum = 0;
for(i = 1;i <= N ;i ++)
v[i] = i;
sort(road, E);
for(i = 1;i <=E; i++){
a = getRoot(road[i].a);
b = getRoot(road[i].b);
if(a!=b){
v[a] = b;
sum += road[i].weight;
}
}
}