Official

Ex - We Love Forest Editorial by nok0


前提知識

  • bit DP

今回と似た遷移のbit DP が https://atcoder.jp/contests/abc213/tasks/abc213_g/editorial で詳しく解説されているので、そちらを参照してください。

  • 行列木定理

以下では定理の主張のみを述べるので、証明などを知りたい方は行列木定理で調べてみてください。

行列木定理

\(N\) 頂点 \(M\) 辺の無向グラフ \(G\) に対し、\(N\times N\)ラプラシアン行列 \(L\) を以下で定義する。

\(L_{i,j} := \begin{cases} 頂点 i の次数 \ (i =j) \\ 頂点 i と頂点 j を結ぶ辺の本数 \times (-1) \ (\mathrm{otherwise}) \end{cases}\)

このとき、 \(G\) の全域木の個数は \(L\) の任意の余因子に等しい。

解法

行列木定理と bit dp により解きます。

以下では \(G\) の頂点集合を \(V:=\{1,2,\ldots,N\}\) とします。\(S \subseteq V\) を満たす \(S\) に対し、\(f(S),g_i(S)\) を以下で定めます。

  • \(f(S):=S\subseteq V\) を頂点集合とする木の個数
  • \(g_i(S):=S\subseteq V\) を頂点集合とする \(i\) 辺の森の個数

このとき、 \(K=i\) の場合の答えは \(\frac{g_i(V)i!}{m^i}\) と表すことができます。よって、\(g_1(V),g_2(V),\ldots,g_{N-1}(V)\) が列挙できれば良いです。

\(f(S)\)は、行列木定理により \(\mathrm{Ο}(N^3 2^N)\) で求めることができます。

\(g_i(S)\) は、ABC213-G と同様の方法で求められます。 \(S\) に含まれる頂点を任意に一つ固定すると(これを \(v\) とします)、\(v\) の連結成分は木を成しているので、以下の関係式が成立します。

\[g_i(S) = \sum_{v \in T \subset S} f(T)g_{i - (|T| - 1)}(S \setminus T) \]

この式に従い、部分集合を列挙するアルゴリズムを用い \(g_i(S)\) を昇順に計算することで、 \(g_i(S)\)\(\mathrm{Ο}(N 3^N)\) で求められます。

以上よりこの問題を \(\mathrm{Ο}(N^3 2^N + N 3^N)\) で解くことができました。

posted:
last update: