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:
- Empieza coloreando cada nodo de verde.
Ahora sigue los siguientes pasos para cada nodo:
- Si el nodo es rojo, omítelo. Ya lo hemos revisado en busca de ciclos.
- Si el nodo es amarillo, tienes un ciclo. Hemos terminado.
- 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 bien encuentras un nodo amarillo o no. Si no encontraste uno, no hay ciclo. Si lo encontraste, entonces hay un ciclo y contiene al nodo amarillo.
Vamos a ver tu ejemplo. Empezamos con todo en verde. Supongamos que vamos a mirar los nodos en orden A, B, C, D, E, F.
A se vuelve amarillo. Ahora debemos mirar B, C, D a continuación.
B se vuelve amarillo. Luego debemos mirar E a continuación.
E se vuelve amarillo. Luego debemos mirar F a continuación.
F se vuelve amarillo.
F se vuelve rojo.
E se vuelve rojo.
B se vuelve rojo.
C se vuelve amarillo. Luego debemos mirar F a continuación.
F es rojo, así que lo omitimos.
C se vuelve rojo.
D se vuelve amarillo. Luego debemos mirar 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 en rojo, 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 mirar a B a continuación.
B se vuelve amarillo; debemos mirar a C a continuación.
C se vuelve amarillo; debemos mirar a A a continuación.
A está en amarillo. Hay un ciclo.
¿Tiene sentido?
Algoritmo adicional: Supongamos que el grafo es acíclico. Cuando colores un nodo de rojo, ponle un número incrementado. En nuestro ejemplo, F = 1, E = 2, B = 3, C = 4, D = 5, A = 6. Si quitas los nodos del grafo en ese orden, nunca eliminarás un nodo que tenga una arista saliente.
Por eso se llama "ordenamiento topológico". Nos permite encontrar un orden en un DAG donde una flecha apuntando de A a B significa "la tarea A no puede realizarse hasta que se haya realizado la tarea B". En nuestro ejemplo, F debe hacerse primero, y efectivamente se hace. Quitamos F del grafo, y ahora E debe hacerse a continuación. Quitamos E del grafo y ahora B, C o D son igualmente buenos para hacerse, 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 "todo adentro" o "todo afuera", 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 tratan bien con tu ejemplo. Si tu reducción te lleva a una situación donde cada vértice tiene flechas tanto hacia adentro como hacia afuera, simplemente toma un camino y continúa. Si llegas a un punto donde no tienes opción, debes haberlo visitado anteriormente (cada punto tiene una flecha hacia afuera, así que ya lo has utilizado), y por lo tanto es fácil ver que hay un ciclo.
0 votos
Puede obtener una respuesta de las potencias de la matriz de adyacencia...