ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ARC099 E - Independence

問題
提出コード

解法

頂点ijの間に辺が張られていない場合、これらを同じ州に含めることができません。
これは全ての張られていない辺について成り立ちます。逆に、同じ州に含めることができない頂点対に辺を張ったグラフを考えると(これは与えられるグラフの補グラフです)、それぞれの連結成分が二部グラフになっている必要があることがわかります。
ということで、まず構築できる条件がわかったのでチェックします。
二部グラフ判定は、補グラフについてワーシャルフロイドを適用した後、全ての頂点のタプル(i,j,k)について、ijの距離の偶奇が、iからkの距離とkからjの距離の和の偶奇と一致しているかどうかを見ればよいです。
さて、辺の数を最小にする問題を考えます。
ある州にx個の頂点を含ませた場合、そこに存在する辺の本数は

  • x(x-1)/2

です。また、もう片方の州はn-x個の頂点が存在しているはずで、こちらも同様に辺の本数を数えることができます。
ということで、州の個数がxにできるかどうかを判定し、できる個数のうち辺が最小のものを選べば答えとなります。
あとは、x個からなる州が作成可能かどうかわかればよいです。
先ほどの補グラフに再び注目します。
ある連結成分についてみると、二部グラフの頂点のグループは一意に定まります(適当な頂点からの距離を調べ、偶奇でグループ分けすればよいです)。
ですが、どちらのグループを州に含めるか、というのはそれぞれの連結成分ごとに自由に決められます。
ということで、

  • dp[i][j] = i番目の連結成分までみて、j個からなる州の集合が作成可能かどうか(bool値)

というdpが考えられます。
今見ている連結成分のグループの個数のペアが(a,b)だった際、
dp[i][j] = dp[i-1][j-a]\ OR \ dp[i-1][j-b]
という遷移を行えばよいです。
これで、作成できる州の頂点数がわかったので、あとは最小値を計算すれば終わりになります。

感想

補グラフと二部グラフがうまく考察できたので嬉しいです。面白かったです。