AcWing 859. Kruskal算法求最小生成树
原题链接
简单
作者:
StungYep
,
2019-08-05 16:47:11
,
所有人可见
,
阅读 858
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=2e5+10;
int fa[maxn],ran[maxn],n,m; //并查集中的父结点数组和秩序数组
struct node
{
int l,r,val; //左右端点及权值
}arr[maxn];
void init()
{
for(int i=1;i<=n;++i)
fa[i]=i,ran[i]=0;
}
int ffind(int x)
{
return x==fa[x]?x:fa[x]=ffind(fa[x]);
}
void unite(int x,int y)
{
int fx=ffind(x);
int fy=ffind(y);
if(fx==fy) return;
if(ran[fx]<ran[fy]) fa[fx]=fy;
else{
fa[fy]=fx;
if(fa[fx]==fa[fy]) ran[fx]++;
}
}
bool operator < (node &a,node &b)
{
return a.val<b.val; //重载小于号,按权值从小到大排序
}
int Kruskal()
{
int res=0,tot=0;
for(int i=1;i<=m;++i)
{
if(ffind(arr[i].l)!=ffind(arr[i].r))
{
tot++;
res+=arr[i].val;
unite(arr[i].l,arr[i].r);
}
if(tot==n-1) return res;
}
return inf;
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
for(int i=1;i<=m;++i)
cin>>arr[i].l>>arr[i].r>>arr[i].val;
sort(arr+1,arr+m+1);
init();
int res=Kruskal();
res==inf?cout<<"impossible"<<endl:cout<<res<<endl;
}
}