dfs序求lca

本文截取自https://www.cnblogs.com/kousak/p/9192094.html博主的一部分!

void dfs(int p, int fa) {
  bz[p][0] = fa, in[p] = ++cnt;
  for (int i = 1; i < bzmax; i++)
    bz[p][i] = bz[bz[p][i - 1]][i - 1];
  for (int i = g.h[p]; ~i; i = g[i].nx){
    int e = g[i].ed;
    if (e == fa) continue;
    dfs(e, p);
  }
  out[p] = cnt;
}


int lca(int a, int b) {
  if (dep[a] > dep[b]) swap(a, b);
  if (in[a] <= in[b] && out[a] >= out[b])
    return a;
  for (int i = bzmax - 1, nx; ~i; i--) {
    nx = bz[a][i];
    if (!(in[nx] <= in[b] && out[nx] >= out[b]))
    a = nx;
  }
  return bz[a][0];
}

猜你喜欢

转载自www.cnblogs.com/ouyang179/p/11299668.html
今日推荐