2016-10-01 6 views
1

Это алгоритм BFS я придумал, чтобы напечатать все кратчайшие пути от корневого узла к любому другому узлу в графе:Реализация BFS алгоритм с максимальной глубиной и которая печатает все кратчайшие пути

d = deque() 
d.append(root) 
level = 0 
while len(d) >= 0 and level <= max_depth: 
    u = d.popleft() 
    print(adjacency_list[u]) 
    for v in adjacency_list[u]: 
     if visited[v] == 'N': 
      if nodes2distances[u] + 1 <= nodes2distances[v]: 
       nodes2distances[v] = nodes2distances[u] + 1 
       node2parents[v].append(u) 
       d.extend(v) 
    level += 1 
    visited[u] = 'Y' 

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

1) Не могли бы вы объяснить, как я мог реализовать этот алгоритм с ограничением уровня (т. Е. Указав максимальный уровень)?

2) Кроме того, не могли бы вы сообщить мне, если подход, который я принял для решения проблемы, может быть лучше?

Редактировать: ОК. Извините, я этого не делал раньше! Скажем, у меня есть следующие ребра в виде невзвешенном графа:

('A', 'B'), ('A', 'C'), ('B', 'C'), ('B '', 'D'), ('D', 'E'), ('D', 'F'), ('D', 'G'), ('E', 'F'), ('G »,„F“)

После реализации моего кода без ограничения глубины, я получаю следующий результат, когда я вызвать алгоритм для узла „B“,

[('A', ['B']), ('C', ['B']), ('D', ['B']), ('E', ['D']), ('F', ['D']), ('G', ['D'])] 

Однако, когда я вызывать ту же функцию с ограничением уровня 2, то есть myFunction(graph,'E',2), я получаю следующий результат:

[('A', ['B']), ('C', ['B']), ('D', ['B'])] 

тогда, ожидаемый выход на

[('A', ['B']), ('C', ['B']), ('D', ['B']),('E',['D']),('F', ['D']),('G',['D'])] 
+0

Просьба привести примеры (входов образцов, как ожидается выход, фактический выход) – thefourtheye

+0

Пожалуйста, объясняющие, что представляет собой этот выход. Как это все кратчайшие пути? –

+0

Hello Sarid! Поскольку это невзвешенный график, кратчайший путь - это количество уровней от корня до узла. В приведенном выше примере я просто печатаю родителей, так что это выглядит запутанным. Я уже много раз переполнял стек, но раньше я не задавал вопросы (я сейчас учусь), поэтому извиняюсь за то, как я сформулировал вопрос. –

ответ

1

Вы увеличивающийся уровень в неправильном месте. Уровень каждого узла равен его родительскому уровню плюс 1. Вы не должны увеличивать уровень в глобальном масштабе в цикле while. Вместо этого вы должны сохранить уровень каждого узла, который вы положили в очередь. Что-то вроде этого:

d = deque() 
      #node,level 
d.append((root,0 )) 
while len(d) >= 0: 
    front = d.popleft() 
    u = front[0] 
    level = front[1] 
    if level >= max_depth: 
     break 
    print(adjacency_list[u]) 
    for v in adjacency_list[u]: 
     if visited[v] == 'N': 
      if nodes2distances[u] + 1 <= nodes2distances[v]: 
       nodes2distances[v] = nodes2distances[u] + 1 
       node2parents[v].append(u) 
       d.append((v,level+1)) 
    visited[u] = 'Y' 
+0

Эй, спасибо за ваш ответ! Я понял, что вы пытаетесь сделать здесь. При выполнении вышеуказанной программы «d.extend (v, level + 1)» дает мне ошибку, когда мы достигаем «level = front [0]». Я изменил его на «d.append (v, level + 1)». Он работал на max_depth = 2. Но это не удалось для max_depth = 5, поэтому мне пришлось изменить условие в цикле while на len (d)> 0 '. Теперь он отлично работает. Огромное спасибо!!! –

+0

@ Nik.Birur Надеюсь, у вас есть идея;) – Tempux

+0

да! Большое вам спасибо! Прежде чем вы объяснили, я был так смущен, но только после того, как я посмотрел на ваше решение, я чувствую, что это так просто! Lol Спасибо за помощь !! Ты лучший! –