指定された頂点たちの最小共通祖先関係を保って木を圧縮してできる補助的な木

これはステージング環境です。5 秒後に自動的に本番環境 (https://noshi91.github.io/algorithm-encyclopedia) にリダイレクトされます。リダイレクトを抑止したい場合は #noredirect を付けた URL /algorithm-encyclopedia/auxiliary-tree#noredirect を利用してください。
name
指定された頂点たちの最小共通祖先関係を保って木を圧縮してできる補助的な木
short description
与えられた根付き木 T=(V,E;r)T = (V, E; r) とその頂点の部分集合 XVX \subseteq V に対し、XX に含まれる頂点同士の最小共通祖先関係を失わないように TT を圧縮して根付き木を作ることができる。なお、この木は日本の競技プログラミングの界隈では "auxiliary tree" と呼ばれることもあるが、この呼び方は推奨されない。
input
根付き木 T=(V,E;r)T = (V, E; r) とその頂点の部分集合 XVX \subseteq V
output
XX に含まれる頂点同士の関係を失わないように TT を圧縮してできる根付き木 TT'
time complexity
O(V)O(\lvert V \rvert) で構築できる。複数の頂点の部分集合 X0,X1,,XQ1X_0, X_1, \dots, X _ {Q - 1} のそれぞれについて構築する場合でも全体で O(V+iXi)O(\lvert V \rvert + \sum _ i \lvert X_i \rvert) で構築可能である。

概要

与えられた根付き木 T=(V,E;r)T = (V, E; r) とその頂点の部分集合 XVX \subseteq V に対し、XX に含まれる頂点同士の子孫/祖先関係や最小共通祖先関係を失わないように TT を圧縮してできる補助的な根付き木 TT' を考えると便利であることがある。 より正確には、XX に含まれる頂点の組 (x,y)X2(x, y) \in X^2 のそれぞれに対してその最小共通祖先 z=lca(x,y)z = \mathrm{lca}(x, y) を考え、そのような頂点の全体 V={lca(x,y)(x,y)X2}V' = \lbrace \mathrm{lca}(x, y) \mid (x, y) \in X^2 \rbrace の間に元々の木 TT での子孫関係で辺を張ってできるものがその根付き木 T=(V,E;r)T' = (V', E'; r') である。

この木 TT'XX の頂点をすべて含む (つまり XVX \subseteq V')。 また TT' の任意の頂点 x,yVx, y \in V' に対し、それらの TT における最小共通祖先とそれらの TT' における最小共通祖先とは一致する。 そしてこの木 TT' の頂点数は 2X12 \lvert X \rvert - 1 頂点以下になることが示せる。 この木の構築は単純な DFS を用いることで O(V)O(\lvert V \rvert) 時間で可能である。

与えられた複数の頂点の部分集合 X0,X1,,XQ1X_0, X_1, \dots, X _ {Q - 1} のそれぞれに対しての QQ 個のこのような補助的な木をまとめて構成することも K=i<QXiK = \sum _ {i \lt Q} \lvert X_i \rvert に対し O(VlogV+KlogK)O(\lvert V \rvert \log \lvert V \rvert + K \log K) 時間で可能である。 これには sparse table などによるクエリが定数時間の LCA および Euler tour technique を用いる。 頂点の部分集合 XiX_i はオンラインに与えられても構わない。 また、LCA に構築が線型時間かつクエリが定数時間のものを用いれば O(V+KlogK)O(\lvert V \rvert + K \log K) 時間で、クエリがオフラインに与えられると仮定してバケットソートを利用すれば O(VlogV+K)O(\lvert V \rvert \log V + K) 時間で、これらの両方を用いれば O(V+K)O(\lvert V \rvert + K) 時間での構築も可能である。

たとえば、図 1 のような根付き木 TT からその頂点の部分集合 X={7,9,11,13,14}X = \lbrace 7, 9, 11, 13, 14 \rbrace による木を作ると図 2 のようになる。

図 1. 元となる根付き木の例
図 2. 図 1 の根付き木から XX に属する頂点たちの最小共通祖先関係を保って木を圧縮してできる補助的な木

詳細

複数のこの補助的な木をまとめて構成する場合の具体的な構成方法については LCAをベースに構築するAuxiliary Treeのメモ - 日々drdrする人のメモarchive.org を参考のこと。

その他

外部リンク

注釈

  1. tmaehara によるツイート: https://twitter.com/tmaehara/status/1391229611187441666 

  2. ただし "virtual tree" という呼称が英語圏の競技プログラミングの界隈で利用されている様子はあまり見られない。"auxiliary tree" と同様に、この "virtual tree" という表現も「実質的な木」という程度の一般的な表現でしかなく、特定の木の名前として利用することは推奨されないものであるという可能性は高い。 

  3. uwi による調査: https://github.com/kmyk/algorithm-encyclopedia/issues/165#issuecomment-850781687archive.org