最小生成树–克鲁斯卡尔算法模板
#include<bits/stdc++.h>
using namespace std;
struct node{int a,b,l;};
node edg[200005];
int n,m,f[5005],ans=0,t=0;
bool cmp(node a,node b)
{
return a.l<b.l;
}
int find(int x)//查找x的爸爸
{
if(x==f[x]) return x;//如果x的爸爸是自己,他就是总爸爸
else return f[x]=find(f[x]);
//x认最后的总爸爸当爸爸,相当于路径压缩
}
void merg(int a,int b)//合并函数
{
int fa=find(a),fb=find(b);
if(fa!=fb) f[fa]=fb;
//a(fa)的总爸爸认b(fb)的总爸爸当爸爸
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) f[i]=i;//每个人的爸爸都是自己
for(int i=0;i<m;i++)
cin>>edg[i].a>>edg[i].b>>edg[i].l;
sort(edg,edg+m,cmp);//按照边集排序
for(int i=0;i<m;i++)
{
if(find(edg[i].a)!=find(edg[i].b))
merg(edg[i].a,edg[i].b), ans+=edg[i].l, t++;
//如果总爸爸不是一个人,合并到一起
if(t==n-1) break;
}
if(t!=n-1) cout<<"orz";
else cout<<ans;
}