Алгоритм поиска всех циклов в графе
От: nen777w  
Дата: 07.12.16 15:45
Оценка:
Дан направленный граф, задан структурно т.е. вершина может содержать ссылки на другие вершины.
Нужно найти все циклы в графе.
Что можно посмотреть на эту тему?
Re: Алгоритм поиска всех циклов в графе
От: LaptevVV Россия  
Дата: 07.12.16 17:16
Оценка:
N>Дан направленный граф, задан структурно т.е. вершина может содержать ссылки на другие вершины.
N>Нужно найти все циклы в графе.
N>Что можно посмотреть на эту тему?
Наверное, нужно начать с определения цикломатического числа и фундаментального цикла.
А вообще-то уже неоднократно обсуждали: http://rsdn.org/forum/alg/110876.flat
Автор: __Avatar__
Дата: 07.10.02
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Компонента сильной связности
От: Qbit86 Кипр
Дата: 07.12.16 18:15
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Дан направленный граф, задан структурно т.е. вершина может содержать ссылки на другие вершины.

N>Нужно найти все циклы в графе.

Можно начать с поиска компонент сильной связности, и потом решать задачу для каждой из них.

N>Что можно посмотреть на эту тему?


Кормен, Лейзерсон, Ривест.
Глаза у меня добрые, но рубашка — смирительная!
Re: Алгоритм поиска всех циклов в графе
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 08.12.16 10:11
Оценка: +1
Здравствуйте, nen777w, Вы писали:

N>Дан направленный граф, задан структурно т.е. вершина может содержать ссылки на другие вершины.

N>Нужно найти все циклы в графе.
N>Что можно посмотреть на эту тему?
1. Поиск в глбуину.
2. Думаю, волновой алгоритм подойдёт в котором за один шаг будет "окрашиваться" веришина в некий цвет который соответствует цвету исходной вершины. На след. шаге просто раскрашиваем смежные вершины проверяя текущий цвет, если он совпал, то вот он, цикл и нужно просто востановить маршрут.
Sic luceat lux!
Отредактировано 08.12.2016 10:17 Kernan . Предыдущая версия . Еще …
Отредактировано 08.12.2016 10:17 Kernan . Предыдущая версия .
Re[2]: Поиск в глубину
От: Qbit86 Кипр
Дата: 08.12.16 10:20
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Поиск в глбуину.


Да, это примитив, который в любом случае будет необходим. Поиск в глубину, как ни странно, занимается не поиском, а построением леса и классификацией дуг. Каждый раз, когда встречаем back edge, это сигнал об обнаружении цикла.
Глаза у меня добрые, но рубашка — смирительная!
Re[3]: Поиск в глубину
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 08.12.16 10:27
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, Kernan, Вы писали:


K>>Поиск в глбуину.


Q>Да, это примитив, который в любом случае будет необходим. Поиск в глубину, как ни странно, занимается не поиском, а построением леса и классификацией дуг. Каждый раз, когда встречаем back edge, это сигнал об обнаружении цикла.

Для непримитива надо теоримы из ТГ смотреть и придумывать что-то. Опять же, все наивные алгоритмы имеют просто неприличную алгоритмическую сложность в худшем случае.
Sic luceat lux!
Отредактировано 08.12.2016 10:28 Kernan . Предыдущая версия .
Re[4]: Поиск в глубину
От: Qbit86 Кипр
Дата: 08.12.16 10:35
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Для непримитива надо теоримы из ТГ смотреть и придумывать что-то. Опять же, все наивные алгоритмы имеют просто неприличную алгоритмическую сложность в худшем случае.


Под примитивом я имел в виду базовую процедуру-кирпичик. Например, предложенный выше поиск компонент сильной связности использует (дважды) обход в глубину.
Глаза у меня добрые, но рубашка — смирительная!
Re: Алгоритм поиска всех циклов в графе
От: peterbes Россия  
Дата: 08.12.16 11:26
Оценка: 4 (1) +1
Здравствуйте, nen777w, Вы писали:

N>Дан направленный граф, задан структурно т.е. вершина может содержать ссылки на другие вершины.

N>Нужно найти все циклы в графе.
N>Что можно посмотреть на эту тему?

На настоящий момент самым эффективным алгоритмом является алгоритм Tiernan-а

см его статью "An algorithm for finding a fundamental set of cycles of a graph"
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.516.9454&rep=rep1&type=pdf

При наличии бесконечной памяти на компьютере, есть вероятность не дожить до того счастливого момента, когда будут найдены все циклы даже для небольшого графа с числом вершин ~100

Программная реализация имеется в boost::graph в tiernan_all_cycles.hpp
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.