AcWing 859. Kruskal算法求最小生成树
原题链接
简单
作者:
Anoxia_3
,
2020-02-21 12:07:36
,
所有人可见
,
阅读 585
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5+10 , M = 2e5;
const int INF = 0x3f3f3f3f;
int pre[N];
int m,n;
struct Edge{ //用于读取数据
int a,b,w;
bool operator<(const Edge &W) const { //重载运算符 ,保证长度顺序
return w<W.w;
}
}Edge[M];
int find(int x){ //查并集核心
if(pre[x]!=x) pre[x] = find(pre[x]);
return pre[x];
}
int Kruskal(){
sort(Edge+1,Edge+m+1); //对长度排序
for(int i = 1 ; i<=n ; i++) pre[i] = i; //初始化查并集
int ans = 0 , s = 0; //ans是总长度 ,s是并入树的边
for(int i = 1 ; i<=m ; i++){
auto t = Edge[i];
t.a = find(t.a); //对一条边的两个点分别找祖宗
t.b = find(t.b);
if(t.a!=t.b){ //如果不是同一个祖宗则不会形成环
pre[t.a] = t.b; //可以相连
ans+=t.w;
s++;
}
}
if(s!=n-1) return INF; //如果并入树的边数不等于点的个数减一说明没有连通
return ans;
}
int main()
{
cin>>n>>m;
for(int i = 1 ; i<=m ; i++){
int x,y,z;
cin>>x>>y>>z;
Edge[i] = {x,y,z};
}
int k = Kruskal();
if(k==INF) cout<<"impossible"<<endl;
else cout<<k<<endl;
return 0;
}