AtCoder Biginner Contest 260 F - Find 4-cycle
コンテスト後に自力ACしましたが、記事を書いていて計算量の見積もりが誤っていたので、公式解説を読みました。
頂点集合を以下の通りとします。
は独立集合であるという条件から、4-cycleをもつ条件は以下に限定されます。
に属するある頂点
と、
に属するある頂点
であって、
のいずれも
の両方に辺がある
そこで、
に属する頂点
が、頂点
に属する2つの頂点
の両方と辺を持つ
という場合に、それを
が頂点対
を持つ
という風に表現したとき、4-cycleを探すという問題は、
から共通の頂点対を持つ2つを見つける
という問題に言い換えられます。
そこで、以下のような解法が考えられます。
について、以下を行う。
と繋がる頂点を
とする。
ここから得られる全ての頂点対について、
が持っているということを記録していく。ここで、既に別の
が、頂点対
を持っていた場合、
を答えとして出力する。
これでACしましたが、問題を解いた後に上記の部分の計算量の見積もりが誤りだったと気づきました。公式解説を見たところ、鳩の巣原理によりとなることがわかりました。
これは、という組は高々
個しかないので、頂点対を調べていくと、高々
回で既に一度調べた頂点対が現れる、ということです。
細かい実装の話に移りますが、C++で頂点対をpair
として、map
に記録する方法だとTLEしました。
二次元配列に記録していく方法だと、ACできました。配列として持てる場合は、map
は使用しない方が良さそうです。