差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
programming_algorithm:graph_theory:lowest_common_ancestor [2019/11/29] – [EulerTour + RMQ] ikatakos | programming_algorithm:graph_theory:lowest_common_ancestor [2019/12/26] – [ダブリング] ikatakos | ||
---|---|---|---|
行 1: | 行 1: | ||
====== 最小共通祖先 ====== | ====== 最小共通祖先 ====== | ||
- | Lowest Common Ancestor, LCA, 最近共通祖先などといわれる。「共通祖先」で検索すると、生物進化方面の用語が混じって出てくる。 | + | Lowest Common Ancestor, LCA, 最近共通祖先などといわれる。「共通祖先」で検索すると生物進化方面の用語が混じって出てくるので記事をやや探しづらい。 |
* [[https:// | * [[https:// | ||
行 50: | 行 50: | ||
===オイラーツアーを用いたLCA=== | ===オイラーツアーを用いたLCA=== | ||
- | LCAを求めるには、オイラーツアーで通りかかった順番に頂点と深さを記録していく。また、その過程で以下の情報も記録していく。 | + | LCAを求めるには、オイラーツアーで通りかかった順番に頂点と深さを記録していく。 |
+ | また、その過程で各頂点が最初に現れた位置も記録していく。 | ||
+ | (実際には、最初に現れた位置でなく、最初~最後までのどこかの位置であればよいが、通常は最初に記録しておくのが一番やりやすい) | ||
* '' | * '' | ||
* $i$ 番目に通りかかる頂点の(深さ, | * $i$ 番目に通りかかる頂点の(深さ, | ||
- | * '' | ||
- | * 頂点 $v$ の深さ | ||
* '' | * '' | ||
* 頂点 $v$ がeular_tour上で初めて現れるindex | * 頂点 $v$ がeular_tour上で初めて現れるindex | ||
行 63: | 行 63: | ||
| | ||
/ \ | / \ | ||
- | 3 4 depth = [0, 1, 1, 2, 2, 3] | + | 3 4 first_appear |
- | | + | | |
5 | 5 | ||
行 101: | 行 101: | ||
$k$ が小さい方から順に全頂点を埋めていくと、$k$ を求める際には $k-1$ の結果を利用できる。 | $k$ が小さい方から順に全頂点を埋めていくと、$k$ を求める際には $k-1$ の結果を利用できる。 | ||
- | 最も深い頂点が1発で根にたどり着けるような $k$ で止める。 | + | 最も深い頂点が1発で根を通り越すような $k$ の直前で止める。 |
== $a,b$ の深さを合わせる == | == $a,b$ の深さを合わせる == | ||
- | $b$ の方が深いとし、深さの差が2進数で 100110 だったとする | + | $b$ の方が深いとし、深さの差が38(2進数で 100110)だったとする。 |
- | 先頭のbitから頂点を遡っていく | + | 立っているbitだけ頂点を遡っていく。0-indexedで1, |
- | b2 = double[b ][5] | + | b2 = double[b ][1] |
b3 = double[b2][2] | b3 = double[b2][2] | ||
- | b4 = double[b3][1] → b4とaで深さが揃った。以降 | + | b4 = double[b3][5] → これでb4とaで深さが揃った |
+ | |||
+ | $b←b_4$ | ||
== 同階層ながら互いに異なる、最も浅い祖先を求める == | == 同階層ながら互いに異なる、最も浅い祖先を求める == | ||
- | $a,b$ から1発で根にたどり着けるような最小の $k$ から、$k$ を1ずつ減らしながら以下を繰り返し行う。 | + | $a,b$ の深さは揃った。そこから1発で根を通り越さない最大の $k$ から、$k$ を1ずつ減らしながら以下を繰り返し行う。 |
- | * '' | + | * '' |
* '' | * '' | ||
* 同じなら何もしない | * 同じなら何もしない | ||
- | * '' | + | |
+ | | ||
$k=0$ までやったら、$a, | $k=0$ までやったら、$a, |