[yukicoder] No.2507 Yet Another Subgraph Counting

スポンサーリンク

概要

問題文 →
自分の提出 →

計算量 $O(N^42^N)$ なので、指数は公式解説よりもよいです(本問の制約下で fastest がとれるかは分かりません)。

必要に応じて、集合べき級数解説 を参照してください。

解法

$S$ と書いたら頂点集合を表します。

点やサイクルを橋でつないだものをカクタスと呼ぶことにします。

数えるべきグラフは、各連結成分がカクタスであるようなグラフです。まず、次を求めます:

  • $dp[S]$:頂点集合 $S$ を点またはサイクルにする方法の数え上げ。

次に、辺 $m=1,2,\ldots,M$ に対して次を計算します:

  • $dp[S]$:頂点集合が $S$ であり、橋がすべて辺 $1,2,\ldots,m$ のいずれかであるようなカクタス。

橋として使用可能な辺 $ab$ をひとつ追加する操作を考えます。すると、新たにできるグラフの頂点集合は、点素な集合 $S_1, S_2$(ただし $a\in S_1$, $b\in S_2$)に対して $S_1\amalg S_2$ と書けるものです。よって、$dp$ のうち $a$ を含まない集合における値を $0$ に置き換えたものを $dp_a$ などと書いて、$dp ← dp + \mathrm{subset convolution}(dp_a,dp_b)$ といった要領で dp テーブルを更新すればよいです。

この計算をすべての辺に行えば、$dp[S]$ として、頂点集合 $S$ に対するカクタスの数え上げが得られています。最後に $\exp(dp)$ を計算すれば、各連結成分がカクタスであるようなグラフの数え上げが得られます。

結局

  • サイクルの数え上げ
  • 辺の個数だけ、subset convolution
  • set power series exp

をやればよく、計算量 $O(MN^22^N)\subset O(N^42^n)$ が達成できます。

タイトルとURLをコピーしました