题目:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 200010;
int n,m;
int s[N];
struct Edge
{
int a,b,w;
}edge[N];//结构体建图
bool cmp(const Edge&a,const Edge&b)
{
return a.w < b.w;
}//sort自定义排序
int find(int x)
{
if(s[x] != x)s[x] = find(s[x]);
return s[x];
}//并查集模板
int main()
{
cin>>n>>m;
for(int i = 0;i < m;i++)
{
int a,b,w;
cin>>a>>b>>w;
edge[i] = {a,b,w};
}
sort(edge,edge + m,cmp);//从小到大排序
for(int i = 1;i <= n;i++)s[i] = i;//并查集初始化
int cnt = 0,res = 0;//cnt表示集合里的个数,res表示当前最小生成树的值
for(int i = 0;i < m;i++)
{
int a = edge[i].a;
int b = edge[i].b;
a = find(a);
b = find(b);
if(a != b)//并查集过程
{
s[a] = b;
cnt++;
res += edge[i].w;
}
}
if(cnt < n - 1)cout<<"impossible"<<endl;
else cout<<res<<endl;
return 0;
}