2021年1月22日金曜日

CodeChef - Path containing K Nodes

uuvvの先祖かどうか調べる方法を思い出す:

  • 各頂点vvにDFS順序で行きの番号pre[v]\operatorname{pre}[v]と帰りの番号post[v]\operatorname{post}[v]を振る。uuvvの(広義の)先祖である必要十分条件はpre[u]pre[v]\operatorname{pre}[u] \le \operatorname{pre}[v]かつpost[v]post[u]\operatorname{post}[v] \le \operatorname{post}[u]が成り立つことである。

KK個の頂点のうち、pre[u]\operatorname{pre}[u]が最大であるようなuupost[v]\operatorname{post}[v]が最小であるようなvvを選ぶ。この二つが同一のとき、上の性質を考えるとKK個の頂点はすべてu=vu=vの先祖なので、一つのパス上にある。

uvu \neq vの場合を考える。パスが存在するならこの2点が(極小のパスの)端点になっているので、KK個の頂点がuuまたはvvの先祖であり、かつu,vu, vのLCAの(狭義の)先祖ではないことが必要十分条件である。