問題はこちら
問題概要
頂点辺の単純無向グラフの各頂点を赤,緑,青で塗り分ける方法で隣接する頂点が異なる色で塗られているようなものは何通りあるか.問題概要2
グラフ理論っぽく書かれていますが,同じ箱に入れてはいけないようなボールの組がいくつか与えられるので区別できる個のボールを区別できるつの箱にいれる方法の数を求める問題です.解説
重要な考え方として,複雑な問題をいきなり解くのではなく単純な問題から考えるようにするとうまくいくことがあります.今回の問題で言うと,色に塗り分ける問題をいきなり解くのではなくて赤と緑の色に塗り分ける問題を考えます.ある頂点を赤で塗ると,その頂点と隣接する頂点は青に塗られます.これを繰り返していくとつの連結成分につき,最初の頂点を赤に塗るか青に塗るかの通りになります.ただし,グラフに奇閉路が存在する場合は色に塗ることはできません.以上から,奇閉路が存在すれば通り,存在しなければ連結成分数をとしてが答えになります.
では,色の場合を考えます.青に塗る頂点を決めれば,残りの頂点を色に塗る問題になります.青に塗る頂点はの全探索をすればいいです.計算量はです.
他にもsubset convolutionを使った解があるらしい(未履修) 勉強しました
別解
結局,頂点をつの独立集合に分ける問題です.全頂点集合をとしてが答えです.ここでとは,頂点集合が独立集合ならそうでないならとなる関数です.
このような畳み込みをSubsetConvolutionといい,で解けることが知られています.参考
SubsetConvolutionを知っていたらそれにしか見えませんね.
提出プログラム
https://atcoder.jp/contests/abc199/submissions/22047215 スパゲッティhttps://atcoder.jp/contests/abc199/submissions/22138032 SubsetConvolution
感想
D問題にしては難しい.考察の沼にハマると抜け出せなさそう.簡単な問題から考えるのは重要.