View on GitHub

cp-library

cluster のマージ過程:静的な top tree

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

ソースコード

nachia/tree/static-top-tree.hpp

主な機能

$n$ 頂点の木の辺を与えると、辺がバラバラの状態から全体の木に至る cluster のマージ過程を求める。 expose, link, cut などの操作をしない top tree に相当する。

以降では、まったく正確な表現ではないが、 cluster を boundary vertex かもしれない相異なる頂点の組 $(s,t)$ を用いて $s \rightarrow t$ で表す。

理論的には、マージ過程を表す木の高さの上限を $4\log _ 2(n)+O(1)$ にとることができる。

class StaticTopTree

コンストラクタ

StaticTopTree();
StaticTopTree(int n, std::vector<std::pair<int,int>> tree, int root = 0);

$n$ 頂点の木を cluster のマージ過程で表す。マージ過程の情報は m_node から得られる。

tree の添え字が辺の番号として使われる。

引数が空の場合、 $2$ 頂点の木で構築する。

m_node

struct Node{
    int p, l, r;
    enum Type{ TyCompress, TyRake1, TyRake2, TyEdge } ty;
};
std::vector<Node> m_node;

マージ過程を表す木のノードを表す。

原理的に要素数は $2n-3$ である。

$p$ が親、 $l$ が左の子、 $r$ が右の子の番号である。それぞれ存在しない場合は $-1$ である。

$\text{ty}$ はノードの種類である。

存在するならば左の子に対応する cluster を $s _ 1\rightarrow t _ 1$ 、右の子に対応する cluster を $s _ 2\rightarrow t _ 2$ とおく。

番号 $i$ のノードについて、 $l\lt i$ と $r\lt i$ が保証される。また、マージ過程を表す木の根に対応する cluster $s\rightarrow t$ について、 $s=\text{root}$ (コンストラクタで与えた値)が保証される。

使用例 : https://twitter.com/NachiaVivias/status/1571466672887963648


TOP PAGE