地址:
用到的合并集合知识:
合并集合(并查集)+求集合的个数_Myblog-CSDN博客
描述:
思想:
代码:
#include <iostream>
//sort 函数要用到
#include <algorithm>
using namespace std;
int n,m;//n个点,m条边
const int N=2e5+10;
//存储节点的父亲节点
int p[N];
struct Edge{
int a,b,w;
//重载运算符,sort函数按照Edge结构体的w权重进行升序排序
bool operator <(const Edge &other) const{
return this->w<other.w;
}
}edge[N];
//返回节点的祖宗节点+路径压缩
int find(int x){
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main(){
int res=0,cnt=0;//res存储最小生成树里边长度之和,cnt是最小生成树里边数之和
cin>>n>>m;
//首先初始化,每个点都是一个集合
for(int i=1;i<=n;i++) p[i]=i;
for(int i=0;i<m;i++){
int a,b,w;
cin>>a>>b>>w;
edge[i]={a,b,w};
}
//根据w权重,将edge[N]数组进行升序排序
sort(edge,edge+m);
//依次枚举每一条边,选出最短的边加入到最小生成树
for(int i=0;i<m;i++){
int a=edge[i].a,b=edge[i].b,w=edge[i].w;
//假如两个集合不连通,需要将这条边连起来
if(find(a)!=find(b)){
p[find(a)]=find(b);//把a节点所在集合加入到b所在集合下
res+=w;
cnt++;
}
}//for
//n个节点全部联通至少需要n-1条边,若是少于n-1,说明没有最小生成树
if(cnt<n-1) cout<<"impossible";
else cout<<res;
return 0;
}