P - Bridge Elimination 解説 by nok0

より高速な解法

概要

公式解説の記法を借ります。

\(p(i)\) は二分木上に畳みこむことで \(\mathrm{O}(N\log^2N)\) で求まります。

\(q(i)\) はLagrange 反転を用いた 2-edge connected graphs の数え上げ、及び 固定された \(k\) に対して、\([x^k] f^i(x)\) を各 \(i\) について列挙するLagrange 反転を用いたテクを用いることで、 \(\mathrm{O}((N\log N)^{1.5})\) で計算できます。

これらにより、時間計算量 \(\mathrm{O}((N\log N)^{1.5})\) の解法が得られます。


公式解説と基本的な方針は同じかと思われますが、方針をまず記します。

積の和典型と対称性を用いると、\(k=1,2,\ldots,N\) に対して、\(\prod_{i=1}^k A_i\) が何回答えに寄与するかが求まればよいです。

まず、\(k\) を固定した場合を考えます。

二辺連結成分を縮約したグラフが木となっており、その木の頂点数が \(k\) 個となっている必要があります。 更に、頂点 \(1\) から頂点 \(k\) は縮約後の頂点が異なる必要があります。

これらの条件を満たす数え上げを考えましょう。

まず、縮約後の頂点について、元のグラフで頂点 \(i\) が含まれているものを頂点 \(i'\) と呼ぶことにします。また、頂点 \(i'\) が含む縮約前の頂点数を以下頂点 \(i'\)サイズ と呼ぶこととします。

頂点のサイズを \(c_1,c_2,\ldots,c_k\) と固定し、頂点番号の割り当て方を考えることとします。

頂点 \(i'\) の一つの頂点の頂点番号は既に頂点 \(i\) と定まっていて、\(c_i-1\) 個の頂点番号はまだ未定であり、頂点 \(k+1\) から頂点 \(N\) を割り当てる必要があります。

割り当て方法はこの考察から多項係数 \(\binom{N-k}{c_1-1, c_2-1,\ldots,c_k-1}\) と表されます。

次に各頂点 \(i'\) の縮約前の辺の張られ方を考えます。これは、\(c_i\) 頂点の橋を持たない連結な単純グラフの総数 \(f_{c_i}\) に等しいです。

\(f_1,f_2,\ldots,f_N\) の列挙はnoshi91 さんの tweet の手法により \(\mathrm{O}((N\log N)^{1.5})\) で可能です。

最後に、縮約後の頂点間を結んで木にする方法の総数を数え上げます。これは、Prüferコードを用いた考察により \(\prod_{i=1}^k c_i N^{k-2}\) と求まります。

以上を整理します。\(k, c_1,c_2,\ldots,c_k\) を固定したときの \(\prod_{i=1}^k A_i\) の寄与回数は、以下の式で表されます。

\[ \binom{N-k}{c_1-1, c_2-1,\ldots,c_k-1} N^{k-2}\prod_{i=1}^k c_i f_{c_i} = (N-k)!N^{k-2} \prod_{i=1}^k \frac{c_if_{c_i} }{(c_i-1)!} \]

\(c_1,c_2,\ldots,c_k\) 全てに対する総和を取るのは、上の式まで整理できていればFPS を用いて簡単に行えます。

\(F(x) = \sum_{i=1}^N \frac{if_i}{(i-1)!}x^i\) と置けば、先ほどの式の全ての \(c\) に対する総和は

\[(N-k)!N^{k-2} [x^N] F^k(x)\]

と求まります。後は、全ての \(k=1,2,\ldots,N\) に対して \([x^N] F^k(x)\) が高速に求まればよいです。これも、先ほどのブログにて \(\mathrm{O}((N\log N)^{1.5})\) で求める方法が記述されています。

以上でこの問題を解くことができました。

投稿日時:
最終更新: