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