Я ищу параллельный алгоритм, который поможет мне в определении циклов в ориентированном графе.
Я знаю, что последовательный алгоритм использует dfs с раскраской, однако я думаю, что он потерпит неудачу в многопоточной среде. Один пример ориентированного графика для иллюстрации:
A → (B, C), B- > (D), D- > (E), C- > (E), E- > (F)
A
/ \
B C
| |
D |
\ /
E
|
F
(Надеюсь, что вышеизложенное дает понять это. Края на графике находятся сверху до botton)
Для вышеописанного графика во время параллельного выполнения возможно выполнение следующего действия.
(схема раскраски, которую я предположила, белая - невидимая, серая - исполнение dfs не завершено и завершено черно-белое исполнение и посещение)
Dfs (B) по потоку 1, который в конечном итоге окрашивает E как серый и делает dfs (E) (что приводит к F). Прежде чем это будет закончено, поток 2 выполняет dfs (C). Он понимает, что E серое и сообщает цикл, который, очевидно, не тот.
Я проверил, что Tarjan algo можно также использовать для обнаружения циклов, но опять же я не думаю, что его выполнение будет правильным в многопоточной среде.
Может кто-нибудь, пожалуйста, помогите мне в этом?
Спасибо.