2

Я хочу найти связанные компоненты прямого ациклического графика с использованием набора узлов. Каким будет наиболее эффективный способ решения этой проблемы?Поиск подключенных компонентов

подсоединенного компонента: Если один из узлов является предшественником или наследников другого узла, они находятся в одной и той же компоненте связности.

Например, у меня есть следующий график и vector = [2,4,5,6,3]. Для этого вектора есть два связанных компонента, как показано ниже.

C1 = [2,4,5,6] 
C2 = [3] 

enter image description here

Мое решение:

  • Сортировать узлы с использованием их глубины значение
  • Укажите узел
  • Проверьте другие узлы, если они являются наследниками или нет. Если да, держите в поиске. Если нет, остановитесь и перейдите к шагу 2.

Как вы думаете?

+0

Сортировка узлов с использованием их значения глубины? В каком порядке? Подключенные компоненты? Вы имеете в виду сильно связанные компоненты или любые подключенные компоненты? – shole

+0

Я имею в виду любые подключенные компоненты. Я смогу выбрать узел в верхней части графика, отсортировав их, используя их значение глубины. @shole – g3d

+0

так сказать, у меня есть 3 узла и два ребра 1 -> 2 & 1 -> 3, {1,2,3} - связная компонента? – shole

ответ

0

Я надеюсь, что я понимаю ваше определение подключенного компонента ... Если это так

Я согласен с @anonymous, вы можете просто сделать граф неориентированным и найти связные компоненты с помощью простого ДФСА ...

Я не совсем понимаю вашу оригинальную мысль, по крайней мере, я думаю, что реализация будет немного сложной, скажем, для ребер {1 -> 2, 2 -> 4, 3 -> 4}, Узел # 1 и # 3 будут отсортированы в начале списка, и как вы можете узнать, что {1,2,3,4} - это один подключенный компонент?

Во всяком случае, сложность же с простым методом ДФСА, в лучшем случае, что O (V)

(Если кто-то думают, что этот ответ является правильным, пожалуйста, дайте всем кредитам на @anonymous!)

-1

путь найти связную компоненту нечто вроде следующего:

while(anymore_root_vertex_tostartfrom){ 
 
    vertex v=pick_a_vertex; 
 
    remove vertex from root_vertex_list; 
 
    initialize connected_comp_list_of_vertices; 
 
    do a breadth_first traversal from this vertex 
 
    keep adding the vertex you encounter in bfs to connected_comp_list_of_vertices 
 
    of that root 
 
}

I woul d предложите прочитать дополнительную информацию о обработке графа. Поиск подключенного компонента, BFS, обход DFS имеют довольно стандартные методы. Отличная книга на эту тему: Skiena's Algoritham Design Manual

+0

для ребер {1 -> 2, 2 -> 4, 3 -> 4}, может ли это найти, что {1,2,3,4} имеют одну и ту же компоненту? – shole

+0

есть. Это то, что обход BFS будет делать в моем psuedocode. – factotum

+0

Ваш BFS игнорирует направление кромки? Если я получу это правильно ... скажем, что корневая вершина равна 1, BFS найдет {1,2,4}, тогда следующая корневая вершина равна 3, которая найдет {3}? – shole