私は試験のために学んでいますが、この問題に対処できません:
n <= 300 000 ノードのグラフが与えられますが、圧縮形式です。この形式は、m <= 300 000 行で構成され、それぞれが a_i、b_i、c_i の 3 つの数値で指定されます。これは、ノード a_i から区間 [b_i, c_i] のすべてのノードへの有向エッジがあることを意味します。問題は、特定のグラフにサイクルが存在するかどうかを判断することです。
入力例: (数値 n、m、グラフを表す m 行)
4 5
1 2 3
1 4 4
2 3 4
3 4 4
4 1 1
答えはイエスです (例えば、サイクル: 1->2->3->4->1)
そして、この入力のために:
4 4
1 2 3
1 4 4
2 3 4
3 4 4
答えはノーだ。
したがって、主な問題は、このグラフが非常に巨大になる可能性があり、グラフを作成して DFS を実行する余裕がないことです。それははるかに速く行われなければなりません。私の最初のアイデアは、トポロジカル ソート アルゴリズムを使用することでした。それが機能する場合、特定のグラフにサイクルはありません。そうでない場合は、サイクルがあります。ただし、ノードの次数を更新するのは困難です (このアルゴリズムの各ステップで deg_in = 0 のノードを選択するため)。インターバル ツリーを使用すると、ノード v を削除すると、隣接リスト (このリストの要素にはインターバルが与えられます) が表示され、すべてのインターバルでそれらのポイントの deg_in が減少します。したがって、対数時間でノードの次数を確認できますが、deg_in = 0 のノードのリストを高速に更新することはまだできません。わかりません。おそらく、修正できない解決策を試しているのでしょうか?
誰でも助けることができますか?