最小生成树(模板)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42369449/article/details/83048166

luogu 3366

模板如下:

#include <bits/stdc++.h>
#define ll long long
#define N 200005 
using namespace std;
int fa[N];
struct node
{
	int l,r,val;
}a[N];
int findf(int x)
{
	if(x==fa[x]) return x;
	return fa[x]=findf(fa[x]);
}
int cmp(node x,node y)
{
	return x.val<y.val;
}
int ans;//判断联通性
int sum;
int n,m;
void Kruskal()
{
	for(int i = 1;i <= m;i++)
	{
		int t1=findf(a[i].l);
		int t2=findf(a[i].r);
		if(t1!=t2)
		{
			ans++;
			sum+=a[i].val;
			fa[t1]=t2;
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i++)
	{
		fa[i]=i;
	}
	for(int i = 1;i <= m;i++)
	{
		scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].val); 
	}
	sort(a+1,a+1+m,cmp);
	Kruskal();
	if(ans==n-1)
	{
		printf("%d\n",sum);
	}else
	{
		puts("orz");
	}
	return 0 ;
}

猜你喜欢

转载自blog.csdn.net/qq_42369449/article/details/83048166