View on GitHub

cp-library

全方位木 DP

C++ 用ライブラリ一覧に戻る

ソースコード

nachia/tree/tree-dp.hpp

主な機能

ユーザーが基本操作を提供すると、プログラムは全方位木 DP によって木全体の集約を行う。

理論

木 $T$ に関して、 $T$ の頂点集合 $T’$ と $T$ の $r$ の組 $(r,T’)$ が次の条件をすべて満たすとき、その組をここでは 強クラスター と呼ぶことにする。

いま、 $T$ の強クラスター $(r,T’)$ に、それぞれ対応する値 $f(r,T’)$ が割り当てられているとする。また、この値に対して次のような操作が許されているとする。

このとき、全方位木 DP では木の頂点数を $n$ として、操作回数を $O(n)$ に抑えて、重要な強クラスターについて $f(r,T’)$ の値を得ることができる。

クラス TreeDP

テンプレート引数

template<class S>
class TreeDP;

強クラスターに対して計算される値の型を S として指定する。

Inner 構造体

Inner 構造体は、 TreeDP<S> の内部に入れ子で実装される。 インスタンスはヘルパー関数から取得する。

インスタンスの取得

// S node(int root)
// S rake(S a, S b, int root)
// S compress(S a, int edgeIndex, int newRoot)
template<
    class NodeInitializer,
    class RakeFunc,
    class CompressFunc
>
static auto Solver(
    const Graph& tree,
    NodeInitializer node,
    RakeFunc rake,
    CompressFunc compress
);

nachia::Graph とは?

メインの処理を行う。

getAtVtx

S getAtVtx(int i);

木 $T$ 全体の頂点集合を $T’$ としたときの $f(r,T’)$ の値を返す。

getAtEdge

S getAtEdge(int root, int edge);

$v=\text{root}$ とし、 $w$ を辺 $\text{edge}$ の $2$ つの端点のうち $v$ でないほうとする。

木 $T$ のうち、 $\text{dist}(v,x)\lt\text{dist}(w,x)$ であるような頂点 $x$ の集合を $T’$ としたときの $f(v,T’)$ の値を返す。


TOP PAGE