logo

Programa Python per a Breadth First Search o BFS per a un gràfic

Ample primer recorregut (o cerca) perquè un gràfic és similar a l'amplada primer recorregut d'un arbre (vegeu el mètode 2 de aquesta publicació ).

L'únic problema aquí és que, a diferència dels arbres, els gràfics poden contenir cicles, de manera que podem tornar al mateix node. Per evitar processar un node més d'una vegada, utilitzem una matriu booleana visitada. Per simplificar, s'assumeix que tots els vèrtexs són accessibles des del vèrtex inicial. Per exemple, en el gràfic següent, comencem el recorregut des del vèrtex 2. Quan arribem al vèrtex 0, busquem tots els seus vèrtexs adjacents. 2 també és un vèrtex adjacent de 0. Si no marquem els vèrtexs visitats, llavors 2 es tornarà a processar i es convertirà en un procés no final. Un primer recorregut d'amplada del gràfic següent és 2, 0, 3, 1.



Recomanat: si us plau, resol-ho PRÀCTICA primer, abans de passar a la solució.

A continuació es mostren les implementacions del simple Breadth First Traversal d'una font determinada.

La implementació utilitza representació de la llista d'adjacència de gràfics. STL 's contenidor de llista s'utilitza per emmagatzemar llistes de nodes adjacents i la cua de nodes necessaris per a la travessa BFS.

Python
# Python3 Program to print BFS traversal # from a given source vertex. BFS(int s) # traverses vertices reachable from s. from collections import defaultdict # This class represents a directed graph # using adjacency list representation class Graph: # Constructor def __init__(self): # Default dictionary to store graph self.graph = defaultdict(list) # Function to add an edge to graph def addEdge(self, u, v): self.graph[u].append(v) # Function to print a BFS of graph def BFS(self, s): # Mark all the vertices as not visited visited = [False] * (max(self.graph) + 1) # Create a queue for BFS queue = [] # Mark the source node as # visited and enqueue it queue.append(s) visited[s] = True while queue: # Dequeue a vertex from # queue and print it s = queue.pop(0) print(s, end=' ') # Get all adjacent vertices of the # dequeued vertex s. # If an adjacent has not been visited, # then mark it visited and enqueue it for i in self.graph[s]: if not visited[i]: queue.append(i) visited[i] = True # Driver code if __name__ == '__main__': # Create a graph given in # the above diagram g = Graph() g.addEdge(0, 1) g.addEdge(0, 2) g.addEdge(1, 2) g.addEdge(2, 0) g.addEdge(2, 3) g.addEdge(3, 3) print('Following is Breadth First Traversal' ' (starting from vertex 2)') g.BFS(2) # This code is contributed by Neelam Yadav # This code is modified by Susobhan Akhuli>

Sortida
Following is Breadth First Traversal (starting from vertex 2) 2 0 3 1>

Complexitat temporal: O(V+E), on V és el nombre de vèrtexs del gràfic i E és el nombre d'arestes
Espai auxiliar: O(V)



Consulteu l'article complet sobre Breadth First Search o BFS per a un gràfic per a més detalls!