Un gráfico mixto es un gráfico que puede tener bordes tanto dirigidos como no dirigidos. Su gráfico subyacente no dirigido se obtiene olvidando las orientaciones de los bordes dirigidos, y en la otra dirección se obtiene una orientación de un gráfico mixto al asignar una dirección a cada borde no dirigido. Un conjunto de aristas forma un ciclo en un gráfico mixto si puede orientarse para formar un ciclo dirigido. Un gráfico mixto es acíclico si y solo si no tiene ciclos.
Todo esto es estándar y hay muchos artículos publicados que mencionan gráficos mixtos acíclicos. Por lo tanto, se debe conocer el siguiente algoritmo para probar la aciclicidad de gráficos mixtos:
Repita los siguientes pasos:
- Elimine cualquier vértice que no tenga bordes dirigidos entrantes y sin bordes incidentes no dirigidos, ya que no puede ser parte de ningún ciclo.
- Si algún vértice no tiene bordes dirigidos entrantes pero tiene exactamente un borde incidente no dirigido, entonces cualquier ciclo que use el borde no dirigido debe entrar en ese borde. Reemplace el borde no dirigido por un borde dirigido entrante.
Deténgase cuando no se puedan realizar más pasos. Si el resultado es un gráfico vacío, entonces el gráfico original necesariamente debe haber sido acíclico. De lo contrario, comenzando desde cualquier vértice que quede, uno puede retroceder a través del gráfico, en cada paso siguiendo hacia atrás a través de un borde entrante o siguiendo un borde no dirigido que no es el utilizado para alcanzar el vértice actual, hasta ver un vértice repetido. La secuencia de aristas seguida entre la primera y la segunda repetición de este vértice (en orden inverso) forma un ciclo en el gráfico mixto.
El artículo de Wikipedia sobre gráficos mixtos menciona gráficos mixtos acíclicos, pero no menciona cómo probarlos, por lo que me gustaría agregarle algo sobre este algoritmo, pero para eso necesito una referencia publicada. ¿Alguien puede decirme dónde aparece (o cualquier otro algoritmo para probar la aciclicidad) aparece en la literatura?
Respuestas:
Encontrar ciclos mixtos en un gráfico mixto es equivalente a encontrar ciclos dirigidos elementales (de longitud> = 3) en el gráfico dirigido correspondiente. El gráfico dirigido correspondiente se obtiene del gráfico mixto reemplazando cada borde no dirigido por dos bordes dirigidos que apuntan en direcciones opuestas. Prueba: (1) Cada ciclo dirigido elemental (de longitud> = 3) en el dígrafo corresponde directamente a un ciclo mixto en el gráfico mixto. (2) Cada ciclo mixto en el gráfico mixto contiene un ciclo mixto elemental de longitud> = 3, y cada ciclo corresponde directamente a un ciclo dirigido elemental (de longitud> = 3) en el gráfico dirigido. (1) y (2) juntos prueban ambas direcciones de la declaración, qed. Por lo tanto, estamos buscando referencias sobre cómo calcular (¿todo?) Ciclos elementales (de longitud> = 3) en un gráfico dirigido.
Los comentarios indican que cs.stackexchange contiene algunas respuestas a esta pregunta, pero no está claro cómo organizar los resultados en una respuesta concisa. Esta publicación de blog parece resumir muy bien las (¿más?) Referencias importantes:
La prueba de aciclicidad en sí misma parece ser fácil: calcule los componentes fuertemente conectados del gráfico. Cualquier ciclo (elemental) está completamente contenido en un componente fuertemente conectado. Un componente fuertemente conectado contiene un ciclo elemental si no es un árbol no dirigido.
El algoritmo propuesto por David Eppstein calcula adicionalmente un ciclo elemental como evidencia, y los algoritmos anteriores enumeran todos los ciclos elementales. Cualquier vértice o borde no contenido en un ciclo elemental podría eliminarse como un paso de preprocesamiento para mejorar la velocidad de los algoritmos anteriores. El algoritmo de David Eppstein podría usarse para ese propósito, pero incluso si solo se usa en los componentes fuertemente conectados, no eliminará todos los vértices o bordes posibles que se pueden eliminar. Pero incluso si se pudiera extender para hacerlo (calcular el árbol de corte de bloque al menos permite eliminar todos los vértices posibles que se pueden eliminar), no está claro si esto realmente mejoraría la velocidad de los algoritmos anteriores.
fuente