Алгоритм поиска внутренне связанного кластера узлов в графе, из которого ни одно ребро не указывает наружу

Я представляю свой график как список смежности. Я хочу знать, как я могу найти кластер узлов, которые связаны внутри, но не имеют внешних точек от них. Есть ли какой-нибудь известный алгоритм, который я могу использовать?

например, это мой график.

1---->2
2---->1
2---->3
3---->1
3---->4
4---->5
5---->4

Здесь узлы 4 и 5 внутренне связаны. Тем не менее, из этого не исходит никакого внешнего края. Это будет мой ответ. Точно так же узлы 1, 2, 3, даже если они образуют цикл, не соответствуют критериям, поскольку внешнее ребро исходит из узла 3. Таким образом, это не то же самое, что найти цикл в списке смежности.

Дополнительное чтение: (зачем мне это нужно) Я работаю над алгоритмом страницы ранжирования (поисковая система), такие узлы, как 4 и 5, называются rank-sink.


person Anon    schedule 14.09.2011    source источник
comment
en.wikipedia.org/wiki/Strongly_connected_component   -  person titus    schedule 14.09.2011
comment
@Anon: После прочтения вашей последней строки становится ясно [необязательное чтение]. Я удалил комментарий.   -  person amit    schedule 14.09.2011


Ответы (1)


Вы можете обнаружить сильно связанные компоненты, используя Косараю, Тарьян или алгоритм Cheriyan-Mehldorn/Gabow.

Найдя эти компоненты, вы сжимаете каждый сильно связанный компонент в один узел (т. е. вы представляете весь компонент одним узлом).

В полученном графе вы ищете узлы без исходящих ребер. Эти узлы представляют интересующие вас компоненты.

person phimuemue    schedule 14.09.2011
comment
Спасибо. У меня не получилось сжать все сильно связанные компоненты в один узел. Как я могу это сделать? - person Anon; 14.09.2011
comment
@Anon: заменяя все ссылки на любой из узлов в компоненте самим компонентом, т. Е. Если 1, 2, 3 принадлежит компоненту A, вы заменяете 5 ----> 1 на 5 ----> A и полностью удаляете такие записи, как 1 ----> 2. - person Grozz; 14.09.2011