#include <iostream>
#include <algorithm>
using namespace std;
const int N=200010;
int n,m;
int p[N];
struct Edge
{
int a,b,w; //w权重
bool operator< (const Edge &W)const
{
return w < W.w; //排序
}
}edges[N];
int find(int x)
{
if (p[x] != x) p[x]=find(p[x]);
return p[x];
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=0;i<m;i++)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
edges[i]={a,b,w};
}
//算法
sort(edges,edges+m);
int res=0,cnt=0;
for (int i=1;i<=n;i++) p[i]=i;//初始化并查集
for (int i=0;i<m;i++)
{
int a=edges[i].a,b=edges[i].b,w=edges[i].w;
a=find(a),b=find(b);//并查集的find 函数 让a,b等于其祖宗节点
if (a != b) //如果a和b不连通
{
p[a]=b;
res+=w;//更新权重之和
cnt++;//一共加了多少边
}
}
if (cnt<n-1) puts("impossible");//最小生成树只有n-1条边
else printf("%d\n",res);
return 0;
}
Kruskal算法
于 2023-03-16 14:26:02 首次发布