Skip to content

Latest commit

 

History

History
72 lines (60 loc) · 3.69 KB

rerooting.md

File metadata and controls

72 lines (60 loc) · 3.69 KB
title documentation_of
Rerooting (全方位木 DP)
./rerooting.hpp

できること

  • ここに記述する内容はリンク [1] で説明されていることとほぼ同等.
  • 木の各頂点・各辺になんらかのデータ構造が載っている.
  • 根付き木について,各頂点 v を根とする部分木に対して計算される Subtree 型の情報を X v とする.また,各辺 u v が持つ Edge 型の情報を e u v とする.
  • X v X v = add vertex ( rake ( add edge ( X c 1 , c 1 , e v c 1 ) , , add edge ( X c k , c k , e v c k ) ) , v ) を満たす.ここで c 1 , , c k v の子の頂点たち.
    • add edge ( X v , v , e u v ) u の子 v について Children 型の情報を計算する関数.
    • add vertex ( y , v ) Children 型の引数 y をもとに頂点 v における Subtree 型の情報を計算する関数.
    • rake ( y 1 , , y k ) は任意個の Children 型の引数の積を計算する関数.
    • rake ( ) には結合法則が成立しなければならない.また, Children 型の単位元を e() とする.
  • 以上のような性質を満たすデータ構造を考えたとき,本ライブラリは森の各頂点 r を根とみなしたときの連結成分に関する X r の値を全ての r について線形時間で計算する.

使用方法(例)

vector<int> inD;
struct Subtree {
    bool exist;
    int oneway, round;
};
struct Children {
    bool exist;
    int oneway, round;
};
Children rake(Children x, Children y) {
    if (!x.exist) return y;
    if (!y.exist) return x;
    return Children{true, min(x.oneway + y.round, y.oneway + x.round), x.round + y.round};
}
Children add_edge(Subtree x, int, tuple<>) {
    if (!x.exist) return {false, 0, 0};
    return {true, x.oneway + 1, x.round + 2};
}
Subtree add_vertex(Children x, int v) {
    if (x.exist) return {true, x.oneway, x.round};
    return {inD[v], 0, 0};
    return {false, 0, 0};
}
Children e() { return {false, 0, 0}; }


vector<vector<pair<int, tuple<>>>> to;
rerooting<tuple<>, Subtree, Children, rake, add_edge, add_vertex, e> tree(to);
tree.run();
for (auto x : tree.dpall) cout << x.oneway << '\n';

また,メソッド get_subtree(int root, int par) によって,木を頂点 parpar 1 の場合は root)を根とした根付き木として見た場合の頂点 root を根とする部分木の情報が取得できる.

int u, v;  // u-v 間に辺が存在
Subtree s1 = tree.get_subtree(u, v);

問題例

リンク

  1. 全方位木DP(ReRooting)の抽象化について - メモ帳
  2. 解説 - エクサウィザーズプログラミングコンテスト2021(AtCoder Beginner Contest 222)
  3. 競技プログラミングにおける全方位木DP問題まとめ - はまやんはまやんはまやん