我喜欢两种 DFS,该怎么办!!!(
  • 板块学术版
  • 楼主KEBrantily
  • 当前回复14
  • 已保存回复14
  • 发布时间2021/6/30 20:18
  • 上次更新2023/11/4 21:08:00
查看原帖
我喜欢两种 DFS,该怎么办!!!(
281497
KEBrantily楼主2021/6/30 20:18

标题先不要管了。

想问在轻重链剖分中,以下两种 dfs1dfs2 有什么区别?

一种是我常写的:

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,最后改成这种写法才过。

请问有什么原因呢?

2021/6/30 20:18
加载中...