ABC Ex
  • 板块学术版
  • 楼主Ginger_he
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/5/20 21:47
  • 上次更新2023/10/23 15:12:04
查看原帖
ABC Ex
379058
Ginger_he楼主2023/5/20 21:47
#include<bits/stdc++.h>
using namespace std;
#define N 200005
struct node
{
	int a,b,c,d,e,f,g;
}las[N];
int n,u,v,a[N],b[N],f[N],s[N],ans[N],res;
bool vis[N];
vector<int> g[N];
int find(int x)
{
	if(x==f[x])
		return x;
	return f[x]=find(f[x]);
}
void dfs(int x,int fa)
{
	int u=find(a[x]),v=find(b[x]);
	las[x]=node{u,v,s[u],s[v],vis[u],vis[v],res};
	if(u==v)
	{
		if(vis[u]) res++;
		vis[u]=0;
	}
	else
	{
		res-=s[u]-vis[u]+s[v]-vis[v];
		f[u]=v,s[v]+=s[u],vis[v]&=vis[u];
		res+=s[v]-vis[v];
	}
	ans[x]=res;
	for(auto i:g[x])
	{
		if(i==fa)
			continue;
		dfs(i,x);
	}
	f[u]=las[x].a,s[u]=las[x].c,s[v]=las[x].d;
	vis[u]=las[x].e,vis[v]=las[x].f,res=las[x].g;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&a[i],&b[i]);
		if(a[i]>b[i])
			swap(a[i],b[i]);
		f[i]=i,s[i]=vis[i]=1;
	}
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1,0);
	for(int i=2;i<=n;i++)
		printf("%d ",ans[i]);
	return 0;
}

为什么并查集一步步撤销就错了?

2023/5/20 21:47
加载中...