1

Может ли кто-нибудь предоставить шаг за шагом псевдокод с помощью BFS для поиска цикла в направленном/неориентированном графике?Обнаружение цикла BFS

Может ли он получить сложность O (| V | + | E |)?

Я видел только реализацию DFS до сих пор.

+1

Почему вы хотите использовать BFS? Тебе обязательно ? Если нет, прочитайте это, вы можете использовать DFS: http://stackoverflow.com/questions/2869647/why-dfs-and-not-bfs-for-finding-cycle-in-graphs – kazu

+0

@kazu Я хочу посмотрите, как это реализовано, потому что моя реализация запутана. –

+0

Вам просто нужно знать, существует ли цикл или вам нужно извлечь конкретный круг? – Codor

ответ

1

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

q <- new queue // for DFS you use just a stack 
append the start node of n in q 
while q is not empty do 
    n <- remove first element of q 
    if n is visited 
     output 'Hurray, I found a cycle' 
    mark n as visited 
    for each edge (n, m) in E do 
     append m to q 

Поскольку BFS посещает каждый узел и каждое ребро только один раз, у вас есть сложности O (| V | + | E |).

+0

Что такое нерекурсивная DFS? Не могли бы вы предоставить псевдокод? Я попытался реализовать, но не смог заставить его работать. –

+0

Я добавил алгоритм как псевдокод. – clemens

+0

спасибо. Нужно ли нам использовать очередь? как вы печатаете? –

0

Я нахожу алгоритм BFS идеальным для этого. Сложность времени такая же.

Вы хотите что-то вроде этого (отредактированный из Википедии):

Cycle-With-Breadth-First-Search(Graph g, Vertex root): 

    create empty set S 
    create empty queue Q  

    root.parent = null 
    Q.enqueueEdges(root)      

    while Q is not empty: 

     current = Q.dequeue() 

     for each node n that is adjacent to current: 
      if n is not in S: 
       add n to S 
       n.parent = current 
       Q.enqueue(n) 
      else //We found a cycle 
       n.parent = current 
       return n and current 

Я добавил только еще свой блок цикла обнаружения цикла и удалить оригинал, если достигли целевого блока для обнаружения цели. В общем, это тот же алгоритм.

Чтобы найти точный цикл, вам нужно будет найти общего предка для n и current. Самый низкий из них доступен в O (n) времени. Чем известен цикл. от предка до n и тока. ток и n связаны.

Для получения дополнительной информации о циклах и BFS читать эту ссылку https://stackoverflow.com/a/4464388/6782134

Смежные вопросы