D - RGB Coloring 2 Editorial by ansain


Dの別解です。

赤で塗る頂点をbit全探索します。

赤で塗った時点で条件を満たさない場合はスキップします。 そうでない場合、赤以外で塗る頂点同士に辺を貼った時に、二部グラフになるか判定します。二部グラフ判定はunionfind等を使って\(O(n+m)\)または\(O(n+m*α(n))\)で行えます。二部グラフであるなら、連結成分の個数(赤で塗った頂点は除外)を\(k\)として、答えに\(2^k\)を加算します。

全体で、\(O((n+m)*2^n)\)または\(O((n+m*α(n))*2^n)\)になりますが、mが大きいなら「赤で塗った時点で条件を満たさない場合はスキップ」で早期breakされることも増えるので、定数倍が軽く間に合います。

実装例(pypy)

posted:
last update: