Breadth-first search

Dado un grafo $G = (V, E)$ y un vértice source $s$, el algoritmo BFS explora sistemáticamente las aristas de $G$ para descubrir todos los vértices de $v \in V$ alcanzables desde $s$. En este proceso:

El nombre de BFS proviene de que el algoritmo explora la frontera entre los vértices descubiertos y los no descubiertos de manera uniforme, visitando todos los vértices a distancia $k$ de $s$ antes de visitar cualquiera a distancia $k + 1$.

Para ir registrando el estado del procedimiento, BFS utiliza tres colores para los vértices de $G$:

BFS comienza agregando $s$ al árbol. Al descubrir un nuevo vértice $v$ en la vecindad del nodo ya explorado $u$, agregamos el nodo $v$ y la arista $(u, v)$ al árbol. Es decir, $u$ resulta el predecesor (padre) de $v$. Como cada vértice es descubierto a lo sumo una vez, cada vértice tiene a lo sumo un padre.

Es importante notar que las relaciones entre ancestros y descendientes son relativas a la raíz $s$.

Pseudocódigo

BFS(G, s)
1 	for each vertex u in G.V - {s}:
2 		u.color = WHITE
3 		u.dist = INF
4 		u.parent = NULL
5 	s.color = GRAY
6 	s.dist = 0
7 	sl.parent = NULL
8	  Q = emptySet
9 	enqueue(Q, s)
10	while Q != emptySet:
11		u = dequeue(Q)
12		for each v in G.adj(u)
13			if v.color == WHITE:
14				v.color = GRAY
15				v.dist = u.dist + 1
16				v.parent = u
17				enqueue(Q, v)
18		u.color = BLACK