#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
struct Node{
int u,v,w;
}a[10005];
int c,ans,k;
int n,m;
int x,y,z;
int father[10005];
int find(int t){
while(father[t]!=t){
t=father[t];
}
return t;
}
int hb(int u,int v){
father[v]=u;
}
bool cmp(Node p,Node q){
return p.w<q.w;
}
int qxx(int u,int v,int w){
a[++c].u=u;
a[c].v=v;
a[c].w=w;
}
int main(){
freopen("最小生成树_Kruskal.in","r",stdin);
freopen("最小生成树_Kruskal.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
qxx(x,y,z);
}
sort(a+1,a+1+m,cmp);
k=0;
for(int i=1;i<=n;i++){
father[i]=i;
}
for(int i=1;i<=m;i++){
if(k==n-1){
break;
}
if(find(a[i].u)!=find(a[i].v)){
hb(a[i].u,a[i].v);
k++;
ans+=a[i].w;
}
}
if(k<n-1){
printf("-1\n");
}
else printf("%d\n",ans);
return 0;
}
最小生成树 Kruskal算法
最新推荐文章于 2022-11-15 09:22:44 发布