AtCoder Grand Contest 067 A問題メモ
今回からRating対象が2000↑、5問体制となったAGC。
とりあえず今後もRatedで迎えたいね。
A - Big Clique Everywhere
問題文
- 1 から N までの番号がついた N 頂点の単純無向グラフ G が与えられます。
- G は M 本の辺を持ち、i 本目の辺は頂点 Ai と Bi を結びます。
- G が次の条件を満たすか判定してください。
- 頂点集合 {1,2,⋯,N} のすべての部分集合 X に対して、X の部分集合 Y であって |Y|≥|X|2 かつ Y がクリークを形成するものが存在する。
- ※クリーク_(グラフ理論):誘導部分グラフが完全グラフとなるような頂点集合
- 解くべきテストケースは T 個あります。
制約
- 1≤T≤103
- 1≤N≤105
- 0≤M≤106
- 1≤Ai,Bi≤N
- 与えられるグラフは自己辺も多重辺も含まない。
- ひとつの入力の中のテストケースすべてにわたる N の総和は 105 以下である。
- ひとつの入力の中のテストケースすべてにわたる M の総和は 106 以下である。
- すべての入力値は整数である。
解法
可能な条件
いくつか例を考える。
- ①連結成分が3つ以上の場合
- 連結成分が2つの場合
- ②2つがいずれもクリークの場合
- ③それ以外
- 連結成分が1つの場合
- ④全体を2つのクリークに分けられる場合
- ⑤それ以外
①連結成分が3つ以上に分かれていると、そこから1点ずつ3点取ってきた X が確実にアウト。
②連結成分が2つの場合、双方ともクリークであったらOK。
どのように X を取っても、当然、半数以上の頂点はどちらかの連結成分に属する。
クリークの誘導部分グラフもクリークなので、多い方の連結成分由来の頂点がクリークをなす。
③逆に片方でもクリークでない場合、「同一連結成分で辺が無い頂点対 + もう片方の連結成分から1点」のような3点からなる X がアウト。
④連結成分が1つの場合、全体を2つのクリークに分けられるなら、②と同じ理由でOK。
与えられたグラフが2つのクリークに分けられるかどうかの判定は 過去に類題があり、「補グラフが二部グラフなら可能」となる。
残る場合分け「⑤連結成分が1つで、2つのクリークに分けられないとき」を考える。
この時、補グラフに奇数長のサイクルが存在していることになる。
この奇数個の頂点を X としてみる。
補グラフ上で互いに隣り合う頂点は同時に Y(クリークをなす頂点集合)に採用できないので、 最大でもサイクル上を1個飛ばしに採用するしかないが、奇数個の場合は |X|−12 個までしか採用できず、条件を満たせない。
よって可能なのは②④のみとなり、結果的に連結成分数は関係なく、「グラフが2つのクリークに分けられること」=「補グラフが二部グラフであること」を判定すれば良いとわかる。
実装
N≤105 なので、辺数が多すぎて実際に補グラフを作れないような入力もあり得る。
N と M の関係から不可能と分かる入力は補グラフを作る前に判定する必要がある。
2つのクリークを作るのに必要な最小辺数は、頂点集合が均等に N2 ずつに分かれるときに最も少なくなる。
N が奇数の場合は1ずれるが、だいたい N2(N2−1) が辺数の最小値となる。
よって、M がこれ未満の場合は不可能。
この時、M≤106 の制約から、可能な入力はおよそ N≤2000 が満たされるので、 このサイズなら補グラフを作ることも可能となる。