Como indica la respuesta de B. Mehta, puedes resolver este problema en el caso general haciendo un ordenamiento topológico. Aquí tienes una guía rápida de cómo hacerlo:
- Comienza coloreando cada nodo de verde.
Ahora haz los siguientes pasos para cada nodo:
- Si el nodo es rojo, omítelo. Ya lo hemos revisado para ciclos.
- Si el nodo es amarillo, tienes un ciclo. Estamos listos.
- El nodo debe ser verde. Recolócalo a amarillo.
- Reinicia este algoritmo para todos los vecinos salientes del nodo actual.
- Cuando todos estén listos, colorea este nodo de rojo.
Una vez que hayas terminado, o te encuentras con un nodo amarillo, o no. Si no lo hiciste, no hay ciclo. Si lo hiciste, entonces hay un ciclo, y contiene el nodo amarillo.
Vamos a revisar tu ejemplo. Comenzamos con todo en verde. Supongamos que vamos a ver los nodos en el orden A, B, C, D, E, F.
A se vuelve amarillo. Ahora debemos ver B, C, D a continuación.
B se vuelve amarillo. Ahora debemos ver E a continuación.
E se vuelve amarillo. Ahora debemos ver F a continuación.
F se vuelve amarillo.
F se vuelve rojo.
E se vuelve rojo.
B se vuelve rojo.
C se vuelve amarillo. Ahora debemos ver F a continuación.
F es rojo, así que lo omitimos.
C se vuelve rojo.
D se vuelve amarillo. Ahora debemos ver E y F a continuación.
Pero ambos son rojos, así que los omitimos.
D se vuelve rojo.
A se vuelve rojo.
B, C, D, E y F están todos rojos, así que hemos terminado, y el grafo es acíclico.
Ahora supongamos que tenemos A -> B -> C -> A. Todos están en verde.
A se vuelve amarillo; debemos ver a B a continuación.
B se vuelve amarillo; debemos ver a C a continuación.
C se vuelve amarillo; debemos ver a A a continuación.
A está amarillo. Hay un ciclo.
¿Tiene sentido?
Algoritmo adicional: Supongamos que el grafo es acíclico. Cuando coloreas un nodo de rojo, ponle un número creciente. En nuestro ejemplo, F = 1, E = 2, B = 3, C = 4, D = 5 A = 6. Si eliminaras los nodos del grafo en ese orden, nunca eliminarías un nodo que tiene una arista saliente.
Por eso esto se llama "ordenamiento topológico". Nos permite encontrar un orden en un DAG donde una flecha que va de A a B significa "la tarea A no se puede hacer hasta que la tarea B esté hecha". En nuestro ejemplo, F tiene que hacerse primero, y efectivamente lo está. Eliminamos F del grafo, y ahora E tiene que hacerse a continuación. Eliminamos E del grafo y ahora B, C o D son igualmente buenos para hacerlos, y luego debemos hacer A por último.
3 votos
Aparte del hecho de que podrías eliminar tanto $A$ como $F$ juntos en la primera etapa como vértices con flechas "todas en" o "todas fuera", y repetir la prueba en cada etapa, lo cual podría ser más eficiente en un grafo dirigido más grande, las respuestas que tienes lidian bien con tu ejemplo. Si tu reducción te lleva a una situación en la que cada vértice tiene tanto flechas de entrada como de salida, simplemente toma un camino y continúa. Si llegas a un punto en el que no tienes opción, es necesario que ya lo hayas visitado antes (cada punto tiene una flecha de salida, por lo que ya la has usado), y por lo tanto es fácil ver que hay un ciclo.
0 votos
Es posible que obtengas una respuesta de los poderes de la matriz de adyacencia...