初めに:これはプログラミングコンテストの問題ですが、進行中の問題ではありません。残念ながら、公開されていないため、このタスクへのリンクは提供できません。それは、2011年にワルシャワコンピュータサイエンススクールが主催したポーランドのローカルプログラミングコンテストの1つからのものでした。
エッジのない頂点のあるグラフと、有向エッジのリストがあります。上の番目の第番目のエッジグラフに追加されています。グラフに1秒後にサイクルが発生することを知りたい。
最も明白な解決策は、各エッジを追加した後にDFSを実行することですが、時間かかります。別の解決策は、トポロジー的にソートされたグラフを維持し、エッジを追加するときに、トポロジーの順序を乱さないように配置することです。これには最大で時間かかります。私はGoogleでいくつかの調査を行いましたが、これが最速のオンラインアルゴリズムのようです。
事前にすべてのエッジを知っているので、オフラインアルゴリズムを使用できます。私が考えることができる最速のオフラインアルゴリズムは、バイナリ検索です。番目の2番目以降のグラフにサイクルが含まれている場合、明らかに他の2番目のサイクルがあります。したがって、バイナリ検索を実行してDFS時間を実行することで最小のを見つけることができます。それぞれが時間を費やすため、このソリューションの全体の複雑さは。
かなり高速ですが、もっと高速なオフラインアルゴリズムはあるのでしょうか。私が考えることができる1つのことは、このエッジがグラフに追加された時間に等しい各エッジの重みを与えることです。次に、このタスクは、最小の最大エッジウェイトを持つサイクルを見つけることと同じです。それがどこにつながっているかはわかりません。