Como indica la respuesta de B. Mehta, se puede resolver este problema en el caso general mediante una topo-clasificación. Aquí tienes una guía rápida de cómo hacerlo:
- Comienza coloreando todos los nodos de color verde.
Ahora haga los siguientes pasos para cada nodo :
- Si el nodo está en rojo, sáltalo. Ya hemos comprobado los ciclos.
- Si el nodo es amarillo, tienes un ciclo. Hemos terminado.
- El nodo debe ser verde. Recolócalo en amarillo.
- Vuelva a iniciar este algoritmo para todos los vecinos salientes del nodo actual.
- Cuando estén todos hechos, colorea este nodo de rojo.
Una vez hecho esto, o bien has encontrado un nodo amarillo, o bien no lo has hecho. Si no lo hiciste, no hay ciclo. Si lo hiciste, entonces hay un ciclo, y contiene el nodo amarillo.
Veamos su ejemplo. Empezamos con todo verde. Supongamos que vamos a mirar los nodos en orden A, B, C, D, E, F.
A becomes yellow. We must now look at B, C, D next.
B becomes yellow. We must look at E next.
E becomes yellow. We must look at F next.
F becomes yellow.
F becomes red.
E becomes red.
B becomes red.
C becomes yellow. We must look at F next.
F is red, so we skip it.
C becomes red.
D becomes yellow. We must look at E and F next.
But they are both red, so skip them.
D becomes red.
A becomes red.
B, C, D, E and F are all red, so we're done, and the graph is acyclic.
Ahora supongamos que tenemos A -> B -> C -> A. Todos son verdes.
A becomes yellow; we have to look at B next.
B becomes yellow; we have to look at C next.
C becomes yellow; we have to look at A next.
A is yellow. There is a cycle.
¿Tiene sentido?
Algoritmo de bonificación: Supongamos que el grafo es acílico. Cuando colorees 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 eliminas los nodos del grafo en ese orden, tendrías nunca eliminar un nodo que tenía un borde de salida .
Por eso se llama "ordenación topológica". Nos permite encontrar un orden en un DAG en el que una flecha que apunta de A a B significa que "la tarea A no puede hacerse hasta que la tarea B esté hecha". En nuestro ejemplo, F tiene que ser la primera en hacerse, y efectivamente, lo es. Quitamos F del gráfico, y ahora hay que hacer E a continuación. Quitamos E del gráfico y ahora B, C o D son igualmente buenas, así que podemos hacerlas, y entonces debemos hacer A en último lugar.
3 votos
Aparte del hecho de que podría eliminar ambos $A$ y $F$ juntos en la primera etapa como vértices con flechas "todo dentro" o "todo fuera", y repetir la prueba en cada etapa, lo que podría ser más eficiente en un grafo dirigido más grande, las respuestas que tienes tratan bien 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 sigue adelante. Si llegas a un punto en el que no tienes ninguna opción, debes haberlo visitado antes (cada punto tiene una flecha de salida, así que ya lo has usado), y por lo tanto es fácil ver que hay un ciclo.
0 votos
Puedes obtener una respuesta de las potencias de la matriz de adyacencia...