#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;
}
为什么并查集一步步撤销就错了?