Problem


Analysis
这道题看起来是最小生成树或者最短路之类的,但因为只用输出边权和,所以直接对边权排序用并查集即可,以及在用并查集的时候可以进行路径压缩降低时间复杂度。
Code
C++
cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int fa[100005];
int f;
bool b=1;
long long ans;
struct edge{
int u,v,w;
}a[100005];
bool cmp(edge x,edge y){
return x.w<y.w;
}
int find_fa(int x){
if(fa[x]==x){
return x;
}
fa[x]=find_fa(fa[x]);
return fa[x];
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;++i){
cin>>a[i].u>>a[i].v>>a[i].w;
}
for(int i=1;i<=n;++i){
fa[i]=i;
}
if(n==1){
cout<<0<<endl;
return 0;
}
if(m<n-1){
cout<<"IMPOSSIBLE\n";
return 0;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;++i){
if(find_fa(a[i].u)!=find_fa(a[i].v)){
ans+=1ll*a[i].w;
fa[fa[a[i].u]]=fa[a[i].v];
}
}
f=find_fa(1);
for(int i=2;i<=n;++i){
if(find_fa(i)!=f){
b=0;
break;
}
}
if(b){
cout<<ans<<endl;
}
else{
cout<<"IMPOSSIBLE\n";
}
return 0;
}