Problem: lab-week10-exercise02 Building a Fiber Network
Problem


Analysis
这道题看起来是最小生成树或者最短路之类的,但因为只用输出边权和,所以直接对边权排序用并查集即可,以及在用并查集的时候可以进行路径压缩降低时间复杂度。
Code
C++
#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;
}
