Ciclos de gráficos de manchas: explicación simple

9

¿Podría alguien ayudarme a entender cómo encontrar ciclos en gráficos en términos simples?

He leído otras preguntas, como Esta y también algunas de las páginas de wikipedia, pero parecen descender bastante rápido a la jerga matemática.

Tengo un modelo del gráfico en java, modelando nodos y bordes 'dentro' y 'fuera', y el modelo conoce nodos solo conectados en una dirección, esto me permite encontrar los nodos hoja como punto de partida, mi plan era para volver a subir el gráfico desde cada uno de estos nodos hoja, para cada "caminata", manteniendo una lista de todos los otros nodos que he encontrado en mi ruta. Si veo algo en la lista en algún momento, sabré que he encontrado un ciclo en el gráfico. Sin embargo, esto se siente un poco simplista.

Estoy seguro de que este es un problema resuelto, sería bueno si pudiera explicarse en términos simples.

-as

phatmanace
fuente

Respuestas:

6

La forma más simple que se me ocurre para explicar los ciclos de gráficos de manchas en términos simples es algo así:

  • Primero, supongo que conoce los conceptos básicos de qué es un gráfico y qué nodos y bordes son. Este ejemplo supone que tiene un gráfico en el que todos los bordes son unidireccionales.
  • Cree su gráfico y seleccione un nodo como punto de partida.
  • Cree un objeto contenedor de algún tipo (una lista o hash funcionaría mejor). Llámalo "visitado".
  • Cree un segundo objeto contenedor (una cola sería ideal aquí) y llámelo "Abierto".
  • Agregue el nodo inicial a la lista Abrir.
  • Repita mientras la lista Abrir no esté vacía:
    • Elimine el primer elemento de Abrir y llámelo Actual
    • Si Current existe en Visited, tiene un ciclo.
    • Si no es así, agregue Current a Visited, y luego agregue todos los nodos que Current puede alcanzar desde sus bordes de salida a Open.
  • Si Abrir termina vacío y no se han detectado ciclos, entonces no tiene ningún ciclo. (Al menos no en el conjunto accesible que se origina desde el punto de partida, que no es necesariamente la totalidad de su gráfico si tiene islas en su gráfico).
Mason Wheeler
fuente
0

Básicamente, primero realiza una búsqueda amplia en el gráfico y realiza un seguimiento de los nodos que ha visitado utilizando un hashmap.

En cualquier momento, si encuentra un nodo que ya ha sido visitado (presente en hashmap), entonces sabe que hay un ciclo en el gráfico.

agente13
fuente