CF875F Royal Questions

CF875F Royal Questions

(本来是拟阵专题的。。)

拟阵

考虑一个公主为边

设M(S,I),I为连通块(最多有一个环),S为边集

遗传性显然

设|A|<|B|

A,B均无环,有环,A有B无可归纳为最小生成树的证明

A无B有,可加环,交换性得证

#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
int n,m;
int x,y,z;
struct Edge{
	int u,v,val;
	bool operator<(const Edge x)const{
		return val>x.val;
	} 
}edge[MAXN];
int fa[MAXN];
int Siz[MAXN];
int find(int x)
{
	if(fa[x]==x)
	{
		return x;
	}
	fa[x]=find(fa[x]);
	return fa[x];
}
void unionn(int i,int j)
{
	int ex=find(i);
	int ey=find(j);
	fa[ex]=ey;
	Siz[ey]|=Siz[ex];
	return; 
}
int main()
{
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d %d",&x,&y,&z);
		edge[i].u=x;
		edge[i].v=y;
		edge[i].val=z;
	}
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
		Siz[i]=0; 
	}
	sort(edge+1,edge+1+m);
	int ans=0;
	for(int i=1;i<=m;i++)
	{
		int fx=find(edge[i].u);
		int fy=find(edge[i].v);
		if(fx!=fy)
		{
			if(Siz[fx]&&Siz[fy])
			{
				continue;
			}
			ans+=edge[i].val;
			unionn(fx,fy);	
		}
		else
		{
			if(!Siz[fx])
			{
				Siz[fx]=1;
				ans+=edge[i].val;
			}
		}
	}
	printf("%d",ans);
 } 
posted @ 2022-06-23 21:35  kid_magic  阅读(38)  评论(1编辑  收藏  举报