求问:重链剖分的代码如何写
  • 板块灌水区
  • 楼主mc_sunduoai
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/4/2 11:00
  • 上次更新2023/10/23 19:40:46
查看原帖
求问:重链剖分的代码如何写
732108
mc_sunduoai楼主2023/4/2 11:00

rt,看了oiwiki,还是没太懂

void dfs1(int o) {
  son[o] = -1;
  siz[o] = 1;
  for (int j = h[o]; j; j = nxt[j])
    if (!dep[p[j]]) {
      dep[p[j]] = dep[o] + 1;
      fa[p[j]] = o;
      dfs1(p[j]);
      siz[o] += siz[p[j]];
      if (son[o] == -1 || siz[p[j]] > siz[son[o]]) son[o] = p[j];
    }
}

void dfs2(int o, int t) {
  top[o] = t;
  cnt++;
  dfn[o] = cnt;
  rnk[cnt] = o;
  if (son[o] == -1) return;
  dfs2(son[o], t);  // 优先对重儿子进行 DFS,可以保证同一条重链上的点 DFS 序连续
  for (int j = h[o]; j; j = nxt[j])
    if (p[j] != son[o] && p[j] != fa[o]) dfs2(p[j], p[j]);
}
2023/4/2 11:00
加载中...