标题先不要管了。
想问在轻重链剖分中,以下两种 dfs1
和 dfs2
有什么区别?
一种是我常写的:
void dfs1(int u,int fat){
dep[u]=dep[fat]+1;
fa[u]=fat;siz[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int to=e[i].to;
if(to==fat) continue;
dfs1(to,u);siz[u]+=siz[to];
if(siz[son[u]]<siz[to]) son[u]=to;
}
}
void dfs2(int u,int tp){
top[u]=tp;
dfn[u]=++cnt;pre[cnt]=u;
if(son[u]) dfs2(son[u],tp);
for(int i=head[u];i;i=e[i].nxt){
int to=e[i].to;
if(to==fa[u]||to==son[u]) continue;
dfs2(to,to);
}
}
另一种是看别人写的:
void dfs1(int u,int fat){
dep[u]=dep[fat]+1;
fa[u]=fat;siz[u]=1;
for(rr int i=head[u];i;i=e[i].nxt){
int to=e[i].to;
if(to==fat) continue;
dfs1(to,u);siz[u]+=siz[to];
}
}
void dfs2(int u,int tp){
dfn[u]=++cnt;
top[u]=tp;pre[cnt]=u;
int Max=-1,s=-1;
for(rr int i=head[u];i;i=e[i].nxt){
int to=e[i].to;
if(to==fa[u]||siz[to]<=Max) continue;
Max=siz[to],s=to;
}
if(Max!=-1) dfs2(s,tp);
for(rr int i=head[u];i;i=e[i].nxt){
int to=e[i].to;
if(to==fa[u]||to==s) continue;
dfs2(to,to);
}
}
看上去只有重儿子的处理方式不同,而且我甚至感觉自己写的比较快一些。
但在 P5556 圣剑护符 这道题中,我用自己写的一直 TLE,最后改成这种写法才过。
请问有什么原因呢?