Considere este gráfico por ejemplo,
Se puede decir que este es un gráfico acíclico dirigido. Ahora, cómo diseñar un algoritmo para verificar eso. Para que un gráfico dirigido sea acíclico, ninguno de los nodos debe tener un borde posterior a su antecesor y no debe haber bucles automáticos.
- ¿Qué pasaría si un procesador pudiera procesar más rápido que la velocidad de la luz?
- ¿Qué métodos de análisis deberían usarse cuando el nivel de la variable dependiente es mucho mayor que el número de variable independiente?
- ¿Cuál es la diferencia entre CS y matemáticas y computación?
- ¿Cómo debo aprender matemáticas para el algoritmo de programación?
- ¿Puede C (lenguaje de programación) tratar con grandes números?
Lo primero que viene a la mente es hacer un dfs y si tratamos de visitar un vértice ya visitado habríamos encontrado un ciclo. Y voila problema resuelto. Pero, no tan rápido, este algoritmo estaría mal . Intenta hacer una prueba en seco sobre el gráfico dado, ¿notas el problema? Observe el nodo 2. Sería visitado dos veces.
Lo importante a tener en cuenta aquí es que el borde de un nodo visitado formará un ciclo, solo si ese nodo visitado es un antepasado del nodo actual.
Lo que podemos hacer es modificar el algoritmo anterior y verificar solo los vértices que están actualmente en la pila recursiva. Ahora, esto podría ser un poco confuso de entender. Considere la pila recursiva 3-> 1-> 7-> 8, en el gráfico dado. Aquí, si hay un borde de 8 a cualquiera de los nodos en la pila recursiva, el gráfico se volvería cíclico.
Tenga en cuenta que con pila recursiva me refiero a algo como esto,
Esta imagen fue tomada de CLRS y los nodos negros representan nodos procesados. Los nodos grises representan, los nodos que se están procesando y los blancos no se han procesado.
Aquí el conjunto de nodos grises representa el estado de la pila recursiva.
Podría simplificar aún más el problema al verificar si el gráfico dado contiene al menos un nodo con bordes salientes solamente.
Supuse que el gráfico está conectado. El algoritmo anterior también puede extenderse a gráficos desconectados.