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 profundidad
Recorre cada rama hasta el final antes de retroceder
Selecciona un algoritmo y genera pasos para comenzar la visualización
La búsqueda en profundidad (DFS) es un algoritmo de recorrido de grafos que explora lo más lejos posible por cada rama antes de retroceder. Partiendo de un nodo origen sigue un camino hasta llegar a un callejón sin salida, luego vuelve al punto de ramificación más reciente y prueba la siguiente arista sin explorar, normalmente con recursión o una pila explícita.
DFS marca el nodo inicial como visitado y luego visita recursivamente el primer vecino no visitado, profundizando en cada paso. Cuando un nodo no tiene vecinos sin visitar, la recursión se deshace y la búsqueda continúa desde el nodo anterior. Cada vértice y arista se maneja exactamente una vez, dando O(V + E) tiempo y O(V) espacio. El orden en que los nodos entran y salen de la recursión produce tiempos de descubrimiento y finalización que usan muchos algoritmos derivados.
DFS es la base de la ordenación topológica, la detección de ciclos, las componentes fuertemente conexas, los puntos de articulación, los puentes y la generación de laberintos. En la práctica sustenta la resolución de dependencias en herramientas de compilación, la detección de bloqueos y los solucionadores de rompecabezas. Los entrevistadores usan DFS constantemente en problemas de retroceso, islas en rejillas y enumeración de caminos.
DFS se suele escribir de forma recursiva, pero la versión iterativa hace explícita la pila y evita desbordar la pila de llamadas en grafos profundos. Ambas producen el mismo orden de descubrimiento.
DFS(grafo, origen):
tiempo = 0
visitar(origen)
visitar(u):
visitados.añadir(u)
desc[u] = ++tiempo // tiempo de descubrimiento
para cada vecino v de u:
si v no está en visitados:
padre[v] = u
visitar(v)
fin[u] = ++tiempo // tiempo de finalizaciónLos tiempos de descubrimiento y finalización son el verdadero producto de DFS. El intervalo [desc[u], fin[u]] de un descendiente queda estrictamente anidado dentro del de su antecesor, y esa propiedad de anidamiento es la base del orden topológico, la detección de ciclos, las componentes fuertemente conexas de Tarjan, los puntos de articulación y los puentes.
Ejecuta DFS desde A sobre el grafo que carga el visualizador por defecto, tomando siempre los vecinos en orden alfabético.
Grafo de ejemplo: Aristas no dirigidas A-B (2), A-C (3), B-C (1) y C-D (4). DFS ignora los pesos.
El orden de recorrido es A, B, C, D. BFS visita estos cuatro nodos en el mismo orden, pero los árboles son distintos: BFS construye un árbol plano con A a B, A a C y C a D, mientras que DFS construye la cadena única A a B a C a D. La arista de retroceso C a A identifica el ciclo A-B-C-A, y los intervalos anidados A[1,8], B[2,7], C[3,6], D[4,5] muestran directamente la profundidad de la recursión.
Tiempo: O(V + E) · Espacio: O(V)
Cada vértice se visita exactamente una vez porque la comprobación de visitados protege la llamada recursiva, y cada arista se examina una vez desde cada extremo, lo que da 2E inspecciones en un grafo no dirigido y E en uno dirigido. El espacio es el conjunto de visitados más la pila de recursión, ambos O(V). La profundidad de la recursión es la longitud del camino simple más largo, así que en un grafo camino de un millón de nodos una implementación recursiva desbordará la pila de llamadas en la mayoría de lenguajes y hace falta la versión con pila explícita.
Elige DFS cuando la pregunta va sobre estructura. Elige BFS cuando va sobre distancia.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| BFS | Necesitas el mínimo número de saltos, recorrido por niveles, o el grafo es muy profundo y es probable que las respuestas estén cerca del origen. | O(V + E) |
| Profundización iterativa | El grafo es prácticamente infinito o muy profundo y aun así quieres la solución menos profunda sin el coste de memoria de BFS. | O(b^d) |
| Componentes fuertemente conexas de Tarjan | Quieres específicamente las SCC de un grafo dirigido. Es DFS más la contabilidad de low-link en una sola pasada. | O(V + E) |
| Union-Find | Solo necesitas componentes conexas en un grafo no dirigido y las aristas llegan de forma incremental. | casi O(E) |
Leer el artículo completo: BFS vs DFS: When to Use Each Traversal
Algoritmos relacionados: Búsqueda en Anchura, Ordenación Topológica, Detección de Ciclos