RT 我现在的写法一般是(将 id rk这些放在dfs1)
但是被P4556打了 发现这东西好像必须放在dfs2 蒟蒻想问问有些什么区别/kk
void dfs1(int x) {
dep[x]=dep[fa[x]]+1; id[x]=++tot; rk[tot]=x; sz[x]=1;
// cout<<x<<endl;
for(int i=head[x];i;i=e[i].nex) {
int y=e[i].to;
if(y==fa[x]) continue;
fa[y]=x;
dfs1(y); sz[x]+=sz[y];
if(sz[y]>sz[son[x]]) son[x]=y;
}
}
void dfs2(int x,int tp) {
top[x]=tp;
if(son[x]) dfs2(son[x],tp);
for(int i=head[x];i;i=e[i].nex) {
int y=e[i].to;
if(y==fa[x]||y==son[x]) continue;
dfs2(y,y);
}
}