Как найти сильно соединенные компоненты на графике?

Я пытаюсь самостоятельно изучить теорию графов и теперь пытаюсь понять, как найти SCC на графике. Я прочитал несколько разных вопросов/ответов о SO (например, 1, 2, 3, 4, 5, 6, 7, 8), но я не могу найти его с полным пошаговым примером, которым я мог бы следовать.

Согласно CORMEN (Введение в алгоритмы), один из методов:

  • Вызов DFS (G) для вычисления времени окончания f [u] для каждой вершины u
  • Вычислить транспонирование (G)
  • Вызовите DFS (Transpose (G)), но в основном цикле DFS рассмотрите вершины в порядке убывания f [u] (как вычислено на шаге 1)
  • Выведите вершины каждого дерева в лесу глубины первого шага 3 как отдельный сильный компонент связи

Обратите внимание на следующий график (вопрос 3.4 из здесь. Я нашел несколько решений здесь и здесь, но я пытаюсь это сломать и понять сам.)

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

Шаг 1: Вызов DFS (G) для вычисления времени окончания f [u] для каждой вершины u

Запуск DFS, начиная с вершины A:

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

Обратите внимание, что RED-текст отформатирован как [Pre-Vist, Post-Visit]

Шаг 2: Вычислить транспонирование (G)

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

Шаг 3. Вызовите DFS (Transpose (G)), но в основном цикле DFS рассмотрите вершины в порядке убывания f [u] (как вычислено на шаге 1)

Хорошо, поэтому вершины в порядке убывания значений после посещения (окончания):

{E, B, A, H, G, I, C, D, F, J}

Итак, на этом этапе мы запускаем DFS на G ^ T, но начинаем с каждой вершины из приведенного выше списка:

  • DFS (E): {E}
  • DFS (B): {B}
  • DFS (A): {A}
  • DFS (H): {H, I, G}
  • DFS (G): удалить из списка, поскольку он уже посещен
  • DFS (I): удалить из списка, поскольку он уже посещен
  • DFS (C): {C, J, F, D}
  • DFS (J): удалить из списка, поскольку он уже посещен
  • DFS (F): удалить из списка, поскольку он уже посещен
  • DFS (D): удалить из списка, поскольку он уже посещен

Шаг 4: Выведите вершины каждого дерева в лесу глубины на шаге 3 как отдельный сильный компонент связи.

Итак, у нас есть пять сильно связанных компонент: {E}, {B}, {A}, {H, I, G}, {C, J, F, D}

Это то, что я считаю правильным. Однако решения, которые я нашел здесь и здесь, говорят SCC {C, J, F, H, I, G, D} и {A, E, B}. Где мои ошибки?

Ответ 1

Ваши действия верны, и ваш ответ также верен, рассмотрев другие предоставленные вами ответы, вы увидите, что они использовали другой алгоритм: сначала вы запускаете DFS на G, а затем запускаете алгоритм неориентированных компонентов на G, обрабатывая вершины в порядке убывания их номеров после предыдущего шага.

Проблема в том, что они выполнили этот последний шаг на G, транспонированном вместо G, и, таким образом, получили окончательный ответ. Если вы прочитаете Dasgupta со страницы 98, вы увидите подробное объяснение алгоритма, который они (пытались) использовать.

Ответ 2

Ваши ответы верны. Согласно CLRS, "сильносвязная компонента ориентированного графа G = (V, E) является максимальным множеством вершин C, таких, что для каждой пары вершин u и v мы имеем как u ~ > v, так и v ~ > u, т.е. вершины v и u достижимы друг от друга".

В случае, если вы допустили {C, J, F, H, I, G, D} как правильные, невозможно достичь от D до G (среди многих других заблуждений), а также с другим набором, существует нет возможности добраться от A до E.