[Lowest Common Ancestor] 木の頂点a,bが与えられた時に、両方の祖先である頂点のうち最も深さが深いもの

求め方

  • 親へのポインタが与えられてる時のダブリング
    • 前処理
      • 各頂点から子へのポインタを作る
      • DFSで各頂点の深さを求める
      • 親へのポインタをダブリングして2^i個上の頂点を得る(O(NlogN))
    • クエリ
      • 与えられた2頂点の深さを得る
      • 深い方のいくつか上の頂点を選び高さを揃える
      • n個上の親が同じものになる最小のnを二分探索で求める
  • 備考
    • n個上の親を得る処理はO(logN)だが、二分探索の時は上の方から試していけば全体でO((logN)^2)→O(logN)にできる

ダブリングによる木の最近共通祖先(LCA:Lowest Common Ancestor)を求めるアルゴリズム | アルゴリズムロジック

  • グラフが与えられるパターンと親頂点が与えられるパターン

LCA ダブリング

オイラーツアー スパーステーブル https://ikatakos.com/pot/programming_algorithm/graph_theory/lowest_common_ancestor

ABC014D