AtCoder Regular Contest 049 - ぬりまーす
問題
頂点のグラフのいくつかの頂点に、以下のような制約を満たすように色を塗る。
- タイプ1:ある頂点に色を塗るとき、既に頂点に色が塗られてなければならない
- タイプ2:ある頂点に色を塗るとき、既に頂点に色が塗られていてはいけない
全ての制約を満たすときに塗れる頂点の最大数を求める。
考察
タイプ1の制約は、「頂点の順番で塗る」ということ。これを「」と表記する。 ある頂点が塗れないとき、を満たし塗れない頂点が存在する、もしくはとなっているとき(「を塗る前にが塗られている」必要がある)である。後者は、有向グラフの閉路検出で、強連結成分分解が使える。2つ以上の頂点を含む連結成分から連鎖的に塗れない頂点がわかる。
タイプ2の制約は、次の2パターンのどちらかを満たせばよい。
- 頂点を塗らない
前者はタイプ1と同一である。Bの上限が小さいので、タイプ2の制約を総当たりで2パターンにどちらかに振り分ける。
実装
塗る順番がであっても、DFSで連鎖的に塗れない頂点を調べるために、の有効辺を追加して強連結成分分解を行う。
頂点を塗らない場合は、ダミーの頂点とがであることにする。