AcWing 859. Kruskal算法求最小生成树
原题链接
简单
作者:
TaoZex
,
2019-08-05 14:40:55
,
所有人可见
,
阅读 1505
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=2e5+10,INF=0x3f3f3f3f;
int n,m;
int fa[N];
struct Edge{
int a,b,w;
bool operator<(const Edge &W)const{
return w<W.w;
}
}edges[M];
int find(int x){
if(x==fa[x]) return x;
else return fa[x]=find(fa[x]);
}
int kruskal(){
sort(edges,edges+m); //先排序,然后是并查集的常规合并
for(int i=1;i<=n;i++) fa[i]=i;
int res=0,cnt=0;
for(int i=0;i<m;i++){
int a=edges[i].a,b=edges[i].b,w=edges[i].w;
int f1=find(a),f2=find(b);
if(f1!=f2){
fa[f1]=f2;
res+=w;
cnt++;
}
}
if(cnt<n-1) return INF;
else return res;
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
edges[i]={a,b,c};
}
int ans=kruskal();
if(ans==INF) puts("impossible");
else cout<<ans<<endl;
}