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);
 } 

                
            
        
浙公网安备 33010602011771号