Найти простые циклы в ориентированном графе

15

Эта проблема для меня выглядит очень интересной. Он собирался найти простой цикл (то есть цикл, где нет повторяющихся узлов) в ориентированном графе.

Мое решение идет следующим образом, то есть этот график является проблемой случая: введите описание изображения здесь

Я знаю, что в графике есть цикл, когда вы можете найти «задние края» в поиске по глубине (пунктирная на моей картинке в DFSTree), и на мгновение я могу быть уверен в нескольких циклах, но не в все, простые циклы. Потому что направленные egdes так важны для цикла, т. Е. (0123)! = (0321)

Я думаю сделать make для каждого узла с back-edge, но я не уверен, и это не ясно. Итак, я прошу вас, если вы ведете меня. Благодарность!. введите описание изображения здесь

Вот мой список простых циклов для моей задачи.

введите описание изображения здесь введите описание изображения здесьвведите описание изображения здесь введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

jonaprieto
источник
Я нашел этот stackoverflow.com/questions/2939877/…
jonaprieto

Ответы:

13

Этот вопрос кажется очень Googleable. Например, вас может заинтересовать алгоритм, представленный в этой статье:

Нахождение всех элементарных цепей ориентированного графа . Дональд Б. Джонсон. СИАМ Ж. КОМПЬЮТ. Том 4, № 1, март 1975 г.

Абстрактный. Представлен алгоритм, который находит все элементарные схемы ориентированного графа во времени, ограниченном O((n + e)(c + 1))пространством O(n + e), в котором есть nвершины, eребра и cэлементарные схемы графа. Алгоритм напоминает алгоритмы Тирнана и Тарьяна, но он быстрее, потому что он рассматривает каждое ребро не более двух раз между любой одной цепью и следующей в выходной последовательности.

Статья содержит полный алгоритм.

badroit
источник
Ok. Бумага идеальна, но могу ли я пойти куда-нибудь со своей работой, или просто посмотреть бумагу? Я искал, чтобы вы познакомили меня с решением, что я подделал с моей идеей?
jonaprieto
2
Ваша главная проблема в том, что дерево dfs не уникально (например, поменяйте местами «1» с «3» на диаграмме). Вам нужно будет просмотреть все возможные dfs-деревья, чтобы перечислить все циклы.
Badroit
1
Если вам нужна Java-реализация этого алгоритма: github.com/1123/johnson
user152468
Ссылка @badroit не работает ... :(
Хорхе Э. Эрнандес,
@ lalongooo, спасибо, да, я заменил его.
бадройт