Графы - поиск циклов
От: __Avatar__ Украина  
Дата: 07.10.02 16:09
Оценка:
Добрый вечер!

Есть ли у кого-то исходники (можно просто алгоритм пошаговый) нахождения циклов в графе.
нужно не просто определить их наличие, а выявить вершины всего цикла.
Если циклов много, то тогда нахождение каждого отдельно, удаление его из графа и поиск в оставшемся графе следующего цикла!
Все что ни происходит — к лучшему!
Re: Графы - поиск циклов
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.10.02 16:45
Оценка:
Здравствуйте __Avatar__, Вы писали:


A>Есть ли у кого-то исходники (можно просто алгоритм пошаговый) нахождения циклов в графе.

A>нужно не просто определить их наличие, а выявить вершины всего цикла.
A>Если циклов много, то тогда нахождение каждого отдельно, удаление его из графа и поиск в оставшемся графе следующего цикла!

Зависит от характеристик графа. В общем случае — волновой алгоритм по графу с глобальным графом строящимся на основании пройденных вершин.
... << Янус 1.0 alpha 10 >>
AVK Blog
Re[2]: Графы - поиск циклов
От: __Avatar__ Украина  
Дата: 08.10.02 09:08
Оценка:
Здравствуйте AndrewVK, Вы писали:

AVK>Зависит от характеристик графа. В общем случае — волновой алгоритм по графу с глобальным графом строящимся на основании пройденных вершин.


То есть ты предлагаешь брать каждую вершину и проверять достижима ли она через другие вершины?
Если так,то это очень долго — а как-нибудь по быстрее.
О графе известно: список вершины, и матрица единичной достижимости (граф планарный).
Все что ни происходит — к лучшему!
Re: Графы - поиск циклов
От: SerpeY Россия  
Дата: 08.10.02 09:49
Оценка:
Здравствуйте __Avatar__, Вы писали:


A>Добрый вечер!


A>Есть ли у кого-то исходники (можно просто алгоритм пошаговый) нахождения циклов в графе.

A>нужно не просто определить их наличие, а выявить вершины всего цикла.
A>Если циклов много, то тогда нахождение каждого отдельно, удаление его из графа и поиск в оставшемся графе следующего цикла!

A>


Правильные слова "топологическая сортировка".
Описание и обсуждение алгоритма можно найти в книге:
Алгоритмы: построение и анализ, Кормен Т., Лейзерсон Ч., Ривест Р.
SerpeY
Re: От модератора
От: Хитрик Денис Россия RSDN
Дата: 10.10.02 09:00
Оценка:
Не знаю, кем и почему тема была перенесена в Исходники, но я переношу её обратно в Алгоритмы.
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re: Графы - поиск циклов
От: Hacker_Delphi Россия  
Дата: 15.10.02 02:51
Оценка:
Здравствуйте __Avatar__, Вы писали:


A>Добрый вечер!


A>Есть ли у кого-то исходники (можно просто алгоритм пошаговый) нахождения циклов в графе.

A>нужно не просто определить их наличие, а выявить вершины всего цикла.
A>Если циклов много, то тогда нахождение каждого отдельно, удаление его из графа и поиск в оставшемся графе следующего цикла!

A>

Транзитивное замыкание
алгоритм:
замыкаем;
замыкаем;
...
замыкаем;

получили, что вершина замыкается сама на себя — помечаем, как участвующую в цикле (каком — не важно).

определение вершин цикла м-да... получится, что все вершины, которые содержатся в циклах (если их больше одного) образуют один большой цикл... и никак от этого не избавиться...

как их раскидать по циклам что-то сразу и не соображу
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re: Графы - поиск циклов
От: bkat  
Дата: 15.10.02 10:28
Оценка:
Здравствуйте __Avatar__, Вы писали:


A>Добрый вечер!


A>Есть ли у кого-то исходники (можно просто алгоритм пошаговый) нахождения циклов в графе.

A>нужно не просто определить их наличие, а выявить вершины всего цикла.
A>Если циклов много, то тогда нахождение каждого отдельно, удаление его из графа и поиск в оставшемся графе следующего цикла!

A>


Небольшое замечание.
Если циклов много, становится важным порядок нахождения и удаления циклов.
От этого порядка зависит конечный результат.
Может для тебя это тоже важно
Re: Графы - поиск циклов
От: LCR Россия lj://_lcr_
Дата: 18.10.02 11:34
Оценка:
Здравствуйте __Avatar__, Вы писали:


A>Добрый вечер!


A>Есть ли у кого-то исходники (можно просто алгоритм пошаговый) нахождения циклов в графе.

A>нужно не просто определить их наличие, а выявить вершины всего цикла.
A>Если циклов много, то тогда нахождение каждого отдельно, удаление его из графа и поиск в оставшемся графе следующего цикла!

Граф связный? Какие циклы нужно находить (гамильтоновы, эйлеровы или любые)? Какой метод удаления? Вот например граф:


Можно последовательно находить и удалять рёбра циклов и получившиеся изолированные вершины: 145, 125, 526, 263, 367.

Можно последовательно находить и удалять рёбра и вершины циклов, тогда: 145, 263, 7 (Заметим, что последняя была изолированная вершина — тоже цикл, только маленький!)

Можно сразу найти цикл 1237654 и удалить эти вершины с инцидентными рёбрами — вообще одна итерация.

Неплохо бы разъяснить по-подробнее.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: Графы - поиск циклов
От: Кодт Россия  
Дата: 18.10.02 14:11
Оценка:
Здравствуйте __Avatar__, Вы писали:

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


AVK>>Зависит от характеристик графа. В общем случае — волновой алгоритм по графу с глобальным графом строящимся на основании пройденных вершин.


A>То есть ты предлагаешь брать каждую вершину и проверять достижима ли она через другие вершины?

A>Если так,то это очень долго — а как-нибудь по быстрее.
A>О графе известно: список вершины, и матрица единичной достижимости (граф планарный).

Например, такой вариант волнового алгоритма.
Если граф не содержит циклов, то это — дерево,
значит, можно ввести строгое упорядочивание вершин,
значит, можно будет построить орграф с ребрами, направленными от "меньших" вершин к "большим".
Орграф понадобится для нахождения цикла (для обнаружения — достаточно просто маркировать вершины).

Да простят мне русскоязычный псевдокод.
Переменные:
  непомеченные : Множество Вершин
  необработанные : Множество Вершин
  корни : Множество Вершин // корневые вершины изолированных подграфов
  назад: Таблица (Вершина --> Вершина)
  номер: Таблица (Вершина --> Номер) // для эффективного поиска подграфа
  следующий : Номер
  циклы: Множество Множеств Вершин

Функции:
  есть_непомеченные() = (множество непомеченных не пусто)
  есть_необработанные() = (множество необработаных не пусто)
  не_помечена(вершина) = (вершина принадлежит непомеченным)

Поехали:

  обработано = помечено = 0
  непомеченные = все вершины
  помеченные = пусто

  пока есть_непомеченные() или есть_необработанные()

    вершина : Вершина // которую будем обрабатывать

    если есть_необработанные()
      вершина = любая из необработанных
      необработанные -= вершина
      номер[вершина] = следующий++
    иначе
      вершина = любая из непомеченных
      непомеченные -= вершина
      корни += вершина // эта вершина - корень нового изолированного подграфа
    конец выбора вершины

    для всех соседей вершины
      сосед : Вершина = очередной сосед

      если не_помечен(сосед)
        непомеченные -= сосед
        необработанные += сосед
        назад[сосед] = вершина
        номер[сосед] = следующий++
      иначе
        // Это цикл! остается его извлечь
        // Цикл состоит из 2 ветвей: одна восходит от текущей, другая - от соседа.
        // т.е. вершина, назад[вершина], назад[назад[вершина]]... и сосед, назад[сосед], назад[назад[сосед]]...
        // Поскольку номер[назад[v]] < номер[v], поиск корня этого цикла - простое занятие

        цикл : Множество Вершин

        повторять
          сравнить номер[вершина] и номер[сосед]
          если ==
            цикл += вершина // вершина == сосед
            выйти из цикла
          если <
            цикл += сосед
            сосед = назад[сосед]
          если >
            цикл += вершина
            вершина = назад[вершина]
          конец выбора
        конец

        циклы += цикл

        // при желании, можно удалять вершины цикла из дальнейшего рассмотрения,
        // то есть из множеств "номер", "назад", "необработанные"
        // тогда не будут обнаружены такие циклы:
        //
        // --(*)--(*)--(*)--(*)--
        //    |    |    |    |
        //    |    +----+    |
        //    +--------------+

      конец проверки соседа
    конец перебора по соседям

  конец обработки
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.