M - 連結グラフ / Connected Graph 解説 by kumjin3141

オンライン畳み込みで解く

オンライン畳み込みで $O(N(\log N)^2) で解く方法を解説します.

\(n\) 頂点の連結無向グラフの総数を \(A_n\) とおきます.

\(A_n\) を,全体から非連結な無向グラフを除外することで計算します.
頂点 \(1\) の所属する連結成分のサイズが \(k\) となるような無向グラフは,

  • 連結成分の残りの \(k-1\) 個を選び,
  • \(k\) 個の頂点が連結となるようにし,
  • 残りの \(n-k\) 個の頂点に適当に辺をはる

ように考えると,

\[ {}_{n-1}C_{k-1} A_k2^{(n-k)(n-k-1)/2} \]

個と計算できます.よって,頂点 \(1\) の所属する連結成分のサイズで場合分けすることで,以下の漸化式が導けます:

\[ \begin{aligned} A_n &= 2^{n(n-1)/2} - \sum_{k=1}^{n-1} {}_{n-1}C_{k-1} A_k2^{(n-k)(n-k-1)/2}\\ &= 2^{n(n-1)/2} - (n-1)!\sum_{k=1}^{n-1} \left(\frac{A_k}{(k-1)!}\right)\left(\frac{2^{(n-k)(n-k-1)/2}}{(n-k)!}\right). \end{aligned} \]

シグマの部分が \(A_1, \dots, A_{n-1}\) を用いた畳み込みの形になっているので,オンライン畳み込みで \(O(N(\log N)^2)\) で解くことができます.

投稿日時:
最終更新: