algo — C++23 日本語リファレンス GitHub

centroid_decomposition

クラス · 重心分解

template <graph_type G>
struct centroid_decomposition;

概要

重心分解

木を重心で再帰的に分解する。重心分解木の親配列を保持し、run で 各重心ごとの集計コールバックを呼べる。 - 重心分解木の再帰は深さ $O(\log n)$ なので再帰で実装する。 - 連結成分の走査・部分木サイズ計算・距離計算は深さ $n$ になりうるため すべて BFS 反復で行い、鎖状の木でもスタックオーバーフローしない。

テンプレートパラメータ

名前 説明
G グラフ型(list_graph<T> / csr_graph<T> のいずれでも可。距離は辺数で数える)

計算量

構築・破棄

名前 説明 計算量
(constructor) 重心分解を実行する。 $O(n\log n)$

メンバ関数

名前 説明 計算量
par 重心分解木における各頂点の親(根は -1)。 $O(1)$
run 各重心ごとに集計コールバックを呼ぶ。 callbackを除き $O(n\log n)$

メンバ型

名前 説明 計算量
component ある重心 c の回で渡される連結成分の情報。 参照用viewで実行時計算量はない

メンバの詳細

(constructor)

explicit centroid_decomposition(const G &g);

重心分解を実行する。

run

template <class F>
void run(F f);

各重心ごとに集計コールバックを呼ぶ。

分解木の根(全体の重心)から順に、各重心 c について f(component) を 1 回ずつ呼ぶ。component 内の配列は呼び出しごとに 使い回されるので、必要なら呼び出し中にコピーすること。

component

struct component;

ある重心 c の回で渡される連結成分の情報。

いずれの配列も頂点番号で添字付けされる。order に現れない頂点 (別成分や used 済み)の成分は未定義なので参照しないこと。

関連項目