①Kuskal算法(克鲁斯卡尔)

时间复杂度为O(m log m)

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
struct edge
{
	int u,v,w;
};
edge a[maxn];
bool cmp(edge f1,edge f2)
{
	return f1.w<f2.w;
}
int fa[5010];
int checkk(int k)
{
	if(fa[k]==k)	return k;
	return fa[k]=checkk(fa[k]);
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
	}
	sort(a+1,a+1+m,cmp);
	for(int i=1;i<=n;i++)	fa[i]=i;
	long long ans=0,cnt=n;
	for(int i=1;i<=m;i++)
	{
		if(cnt==1)	break;
		int x=checkk(a[i].u),y=checkk(a[i].v);
		if(x!=y)
		{
			ans+=a[i].w;
			fa[x]=y;
			cnt--;
		}
	}
	printf("%lld\n",ans);
    return 0;
}