#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1005;
const int inf=1000000000;
int n,ans,numedge,father[maxn];
struct edge{
int u,v;
int cost;
}e[maxn];
bool cmp(edge a,edge b){
return a.cost<b.cost;
}
int findfather(int x){ //递归写法!
if(x==father[x]) return x;
else {
int f=findfather(father[x]); //递归找根结点f!!!
father[x]=f;
return f;
}
}
int kruskal(int n,int m){ //顶点个数,边数!!
ans=0; numedge=0; //最小生成树边权之和以及边数初始化!
for(int i=1;i<n;i++){ //并查集初始化
father[i]=i;
}
sort(e,e+m,cmp); //按照边权给每条边排序
for(int i=0;i<m;i++){ //核心部分!
int fau=findfather(e[i].u);
int fav=findfather(e[i].v);
if(fau!=fav){
father[fau]=fav;
ans+=e[i].cost;
numedge++;
if(numedge==n-1) break;
}
}
if(numedge!=n-1) return -1; //有顶点无法连通!
else return ans; //返回最后的边权之和!
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].cost);
}
int ans=kruskal(n,m);
printf("%d\n",ans);
return 0;
}
kruskal
最新推荐文章于 2024-10-27 14:57:47 发布