int parent[max];
void initParent(int parent[],Graph *G){
for (int i=0;i<G->arcnum;i++) {
parent[i]=i;
}
}
int find_parent(int a){ //找该节点所属的父节点
int t=a;
while(parent[t]!=t)
t=parent[t];
return t;
}
void kruskal(Graph *G,int parent[],arc c){
int sum=0,count=0;
arct minTree[max];
initParent(parent,G);
for(int i=0;i<G->arcnum;i++){
int v1_parent=find_parent(c[i].start);
int v2_parent=find_parent(c[i].end);
if(v1_parent!=v2_parent){//若这两个节点不属于同一个集合则加入最小生成树
minTree[count].start=c[i].start;
minTree[count].end=c[i].end;
minTree[count].w=c[i].w;
sum+=c[i].w;
parent[v1_parent]=v2_parent;
count++;
}
if(count==G->arcnum-1)
break;
}
for(int i=0;i<count;i++) //输出最小生成树的边权值
printf("%d ",minTree[i].w);
}
Kruskal算法找最小生成树
最新推荐文章于 2024-08-13 14:56:59 发布