我正在寻找一种并发算法,它可以帮助我检测有向图中的循环。我知道顺序算法使用深度优先搜索和着色,但我认为在多线程环境下它会失败。以下是一个有向图的示例: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算法也可以用于检测循环,但我认为在多线程环境下它的执行也不正确。
请有人能帮助我吗?
谢谢。