Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Visualizador interactivo de búsqueda en anchura
Explora el grafo nivel por nivel, visitando todos los vecinos antes de bajar más
Selecciona un algoritmo y genera pasos para comenzar la visualización
La búsqueda en anchura (BFS) es un algoritmo fundamental de recorrido de grafos que explora un grafo nivel por nivel. Partiendo de un nodo origen, visita cada vecino a distancia uno, luego cada nodo a distancia dos, y así sucesivamente, usando una cola para gestionar la frontera. Como siempre expande primero los nodos no visitados más cercanos, BFS encuentra el camino más corto en cualquier grafo no ponderado.
BFS coloca el nodo inicial en una cola y lo marca como visitado. Luego extrae repetidamente el nodo del frente, inspecciona sus vecinos y añade al final cualquier vecino aún no visitado. Esta disciplina primero en entrar, primero en salir garantiza que los nodos se procesen en orden creciente de distancia al origen. El algoritmo se ejecuta en tiempo O(V + E) y espacio O(V), donde V es el número de vértices y E el de aristas.
BFS impulsa las consultas de camino más corto en redes no ponderadas, los rastreadores web, las sugerencias de amistad en redes sociales, las búsquedas de difusión GPS y el recorrido por niveles de árboles. También es la base de algoritmos avanzados como Edmonds-Karp para el flujo máximo. BFS es uno de los temas más frecuentes en entrevistas de programación, apareciendo en problemas de rejilla, laberinto y escalera de palabras.
Todo el algoritmo se reduce a una cola y un conjunto de visitados. Cualquier otra propiedad por la que se conoce a BFS se deriva del orden en que la cola devuelve los nodos.
BFS(grafo, origen):
visitados = {origen}
dist[origen] = 0
cola = [origen]
mientras la cola no esté vacía:
u = cola.quitarPrimero()
para cada vecino v de u:
si v no está en visitados:
visitados.añadir(v)
dist[v] = dist[u] + 1
padre[v] = u
cola.añadirAlFinal(v)El invariante es que la cola siempre contiene nodos de como mucho dos niveles de distancia consecutivos, en orden no decreciente. Esa única propiedad es la que garantiza que dist sea correcta: a un nodo se le asigna su distancia la primera vez que se ve, y ya no puede alcanzarse de forma más barata después.
Ejecuta BFS desde A sobre el grafo que carga el visualizador por defecto, para poder seguir cada paso en el panel superior.
Grafo de ejemplo: Aristas no dirigidas A-B (2), A-C (3), B-C (1) y C-D (4). BFS ignora por completo los pesos y cuenta saltos, así que cada arista vale uno.
Las distancias finales son A 0, B 1, C 1, D 2, y los punteros al padre dan el árbol de caminos mínimos A a B, A a C y C a D. Fíjate en que BFS llega a D pasando por C aunque el coste con pesos por esa ruta sea 7 frente al 3 de A a B a C: lo único que optimiza es el número de saltos, que es exactamente la razón por la que los grafos con pesos necesitan Dijkstra.
Tiempo: O(V + E) · Espacio: O(V)
Cada vértice entra en la cola como mucho una vez, porque se marca como visitado en el momento de encolarlo y no al desencolarlo. Eso acota el bucle exterior en V iteraciones. Dentro del bucle, el trabajo es proporcional al grado del vértice actual, y la suma de todos los grados es 2E en un grafo no dirigido, así que recorrer los vecinos suma O(E). El espacio lo dominan el conjunto de visitados, el vector de distancias y la cola, cada uno O(V). Con una matriz de adyacencia el recorrido de vecinos pasa a costar O(V) por vértice y la ejecución completa degrada a O(V al cuadrado).
BFS es la opción por defecto siempre que las aristas no tengan peso. En cuanto aparecen pesos, o el objetivo pasa de distancia a estructura, conviene otra cosa.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| DFS | Necesitas hechos estructurales en lugar de distancia: ciclos, orden topológico, componentes, puentes. Además consume menos memoria en grafos anchos. | O(V + E) |
| Algoritmo de Dijkstra | Las aristas tienen pesos no negativos, con lo que el número de saltos deja de ser la distancia. | O((V + E) log V) |
| BFS 0-1 | Todos los pesos son 0 o 1. Una deque sustituye a la cola y supera a una cola de prioridad completa. | O(V + E) |
| BFS bidireccional | Quieres la distancia entre un par concreto en un grafo grande y puedes buscar hacia atrás desde el destino. | O(b^(d/2)) |
Leer el artículo completo: BFS vs DFS: When to Use Each Traversal
Algoritmos relacionados: Búsqueda en Profundidad, Algoritmo de Dijkstra, Comprobación de Grafo Bipartito