Breadth-First Search (BFS)
Breadth-First Search (BFS) es un algoritmo para recorrer o buscar en grafos (o árboles) que explora los nodos por capas: primero todos los nodos a distancia 1 del origen, luego todos a distancia 2, etc. Usa una cola (queue) para gestionar el orden de visita.
Uso clave: encuentra el camino mínimo (en número de aristas) en grafos no ponderados.
Algoritmo
- Empezamos en un nodo inicial
start. - Marcamos
startcomo visitado y lo metemos en la cola. - Mientras la cola no esté vacía: sacamos el nodo del frente, procesamos sus vecinos no visitados (los marcamos como visitados y los añadimos al final de la cola).
- Repetimos hasta recorrer todo lo alcanzable.
Paso a paso con un ejemplo
Grafo (no dirigido), representado visualmente:
Lista de adyacencia conceptual:
A: [B, C]
B: [A, D, E]
C: [A, F]
D: [B]
E: [B]
F: [C]
Empezamos en A.
Estado inicial:
- Cola:
[A] - Visitados:
{A} - Orden visitado:
[]
Iteración 1:
- Sacamos
A→ procesamos. - Encolamos sus vecinos no visitados
B,C. - Cola:
[B, C] - Visitados:
{A, B, C} - Orden:
[A]
Iteración 2:
- Sacamos
B. - Vecinos:
A(ya visitado),D,E→ encolamosD,E. - Cola:
[C, D, E] - Visitados:
{A, B, C, D, E} - Orden:
[A, B]
Iteración 3:
- Sacamos
C. - Vecinos:
A(visitado),F→ encolamosF. - Cola:
[D, E, F] - Visitados:
{A, B, C, D, E, F} - Orden:
[A, B, C]
Iteración 4:
- Sacamos
D→ no nuevos vecinos. - Cola:
[E, F] - Orden:
[A, B, C, D]
Iteración 5:
- Sacamos
E→ no nuevos vecinos. - Cola:
[F] - Orden:
[A, B, C, D, E]
Iteración 6:
- Sacamos
F→ no nuevos vecinos. - Cola:
[] - Orden:
[A, B, C, D, E, F]
Resultado: BFS visita en orden por capas: A, B, C, D, E, F.
Si queremos el camino más corto de A a F, BFS también nos lo da: A → C → F (2 aristas).
Complejidad y usos
- Tiempo: (V = nodos, E = aristas).
- Espacio: (cola + visited + posibles padres).
- Usos: rutas más cortas en grafos no ponderados, crawlers (por ejemplo webs por niveles), análisis por niveles en árboles (recorrido por niveles), detección de componentes conexas.
Notas y variantes
- En grafos dirigidos funciona igual (usar la lista de salida).
- No sirve para encontrar caminos mínimos en grafos ponderados (usar Dijkstra para pesos ≥ 0).
- Comparado con DFS, BFS explora por niveles (mejor para encontrar caminos cortos), DFS se adentra en profundidad (útil para componentes, topológico, backtracking).