AcWing 859. Kruskal算法求最小生成树
原题链接
简单
作者:
minux
,
2020-04-28 09:51:56
,
所有人可见
,
阅读 580
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,m;
int FA[N]; // 并查集
struct Edge{
int x, y, w;
bool operator< (const Edge &o) const{
return w<o.w;
}
}edges[N];
int Find(int x){
if(x!=FA[x]) FA[x]=Find(FA[x]);
return FA[x];
}
void Union(int x, int y){
int fx=Find(x);
int fy=Find(y);
if(fx!=fy) FA[x]=fy;
}
int main(){
// Kruskal算法
cin>>n>>m;
int x,y,w;
for(int i=0; i<m; ++i){
cin>>x>>y>>w;
edges[i]={x,y,w};
}
// 将边按照权重进行从小到大排序
sort(edges, edges+m);
// 初始化并查集
for(int i=1; i<=n; ++i) FA[i]=i;
int res=0; // 存储MST的权重和
int cnt=0; // 存储MST的边数量
for(int i=0; i<m; ++i){
int x=edges[i].x;
int y=edges[i].y;
int w=edges[i].w;
int fx=Find(x);
int fy=Find(y);
if(fx!=fy){
FA[fx]=fy;
res+=w;
cnt++;
}
}
if(cnt<n-1) cout<<"impossible"<<endl;
else cout<<res<<endl;
return 0;
}