me gustó la primera respuesta de Qiao mucho! Lo único que falta aquí es marcar los vértices como visitados.
¿Por qué tenemos que hacerlo?
imaginemos que existe otro número de nodo 13 conectado desde el nodo 11. Ahora nuestro objetivo es encontrar el nodo 13.
Después de un poco de una carrera de la cola se verá así:
[[1, 2, 6], [1, 3, 10], [1, 4, 7], [1, 4, 8], [1, 2, 5, 9], [1, 2, 5, 10]]
Nota que hay DOS rutas con el nodo número 10 al final.
Lo que significa que las rutas del nodo 10 se verificarán dos veces. En este caso, no se ve tan mal porque el nodo número 10 no tiene hijos ... Pero podría ser realmente malo (incluso aquí revisaremos ese nodo dos veces sin motivo ...)
Número de nodo 13 isn ' t en esas rutas para que el programa no regrese antes de llegar a la segunda ruta con el nodo número 10 al final ... Y lo volveremos a comprobar ...
Lo único que falta es un conjunto para marcar la visita nodos y no para comprobar de nuevo ..
Este es el código de Qiao después de la modificación:
graph = {
1: [2, 3, 4],
2: [5, 6],
3: [10],
4: [7, 8],
5: [9, 10],
7: [11, 12],
11: [13]
}
def bfs(graph_to_search, start, end):
queue = [[start]]
visited = set()
while queue:
# Gets the first path in the queue
path = queue.pop(0)
# Gets the last node in the path
vertex = path[-1]
# Checks if we got to the end
if vertex == end:
return path
# We check if the current node is already in the visited nodes set in order not to recheck it
elif vertex not in visited:
# enumerate all adjacent nodes, construct a new path and push it into the queue
for current_neighbour in graph_to_search.get(vertex, []):
new_path = list(path)
new_path.append(current_neighbour)
queue.append(new_path)
# Mark the vertex as visited
visited.add(vertex)
print bfs(graph, 1, 13)
La salida del programa será:
[1, 4, 7, 11, 13]
Sin las comprobaciones innecesarias.
En realidad, era una tarea pasada que estaba ayudando a un amigo hace meses, basada en la Ley Kevin Bacon. Mi solución final fue muy descuidada, básicamente hice otra búsqueda para "rebobinar" y retroceder. Quiero encontrar una mejor solución. –
Excelente. Considero que revisar un viejo problema en un intento de encontrar una mejor respuesta es un rasgo admirable en un ingeniero. Te deseo lo mejor en tus estudios y carrera. –
Gracias por el elogio, solo creo que si no lo aprendo ahora, me enfrentaré nuevamente con el mismo problema. –