Kruskal算法的c语言实现,输出结果应该是最小生成树各边权值之和
时间: 2023-05-26 12:01:18 浏览: 135
Kruskal算法的c语言实现
5星 · 资源好评率100%
A:下面是Kruskal算法的C语言实现,同时输出最小生成树的各边权值之和:
```c
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100005
#define MAXM 1000005
typedef struct Edge{
int u,v,w;
}Edge;
Edge edge[MAXM];
int father[MAXN];
int n,m;
int cmp(const void* a,const void* b){
return ((const Edge*)a)->w - ((const Edge*)b)->w;
}
int find(int x){
if(father[x]==x)
return x;
return father[x]=find(father[x]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
qsort(edge+1,m,sizeof(Edge),cmp); //将边按权值从小到大排序
for(int i=1;i<=n;i++)
father[i]=i; //初始化并查集
int ans=0,cnt=0;
for(int i=1;i<=m;i++){
int u=edge[i].u,v=edge[i].v,w=edge[i].w;
int fau=find(u),fav=find(v);
if(fau==fav) //如果两个点已经在同一个集合中,说明加入该边会形成环,跳过该边
continue;
father[fau]=fav; //将两个点合并到同一个集合中
ans+=w; //累加边权值
cnt++; //记录加入的边数
if(cnt==n-1) //如果加入的边数等于点数减1,说明已经构成了一棵最小生成树
break;
}
printf("%d\n",ans); //输出最小生成树的所有边权值之和
return 0;
}
```
阅读全文