有向グラフでサイクルを検出するのに役立つ並行アルゴリズムを探しています。
シーケンシャルアルゴリズムが色付きのdfsを使用していることは知っていますが、マルチスレッド環境では失敗すると思います。それを説明するための有向グラフの一例:
A->(B、C)、B->(D)、D->(E)、C->(E)、E->(F)
A
/ \
B C
| |
D |
\ /
E
|
F
(上記が明確になることを願っています。グラフのエッジはすべて上から下にあります)
上記の有向グラフの場合、同時実行中に以下の実行が可能です。
(私が想定した配色スキームは、白-未訪問、灰色-dfsの実行が終了しておらず、黒-実行と訪問が終了しています)
スレッド1によるDfs(B)。これは最終的にEを灰色に着色し、dfs(E)を実行します(Fにつながります)。これが完了する前に、スレッド2はdfs(C)を実行します。Eが灰色であることを認識し、明らかにそうではないサイクルを報告します。
Tarjanのアルゴが循環検出にも使用できることを確認しましたが、マルチスレッド環境ではその実行が正しくないと思います。
誰かがこれについて私を助けてくれませんか?
ありがとう。