Um gráfico misto é um gráfico que pode ter bordas direcionadas e não direcionadas. Seu gráfico não direcionado subjacente é obtido esquecendo as orientações das arestas direcionadas e, na outra direção, uma orientação de um gráfico misto é obtida atribuindo uma direção a cada aresta não direcionada. Um conjunto de arestas forma um ciclo em um gráfico misto, se puder ser orientado para formar um ciclo direcionado. Um gráfico misto é acíclico se e somente se não tiver ciclos.
Isso tudo é padrão e há muitos artigos publicados mencionando gráficos mistos acíclicos. Portanto, o seguinte algoritmo para testar a aciclicidade de gráficos mistos deve ser conhecido:
Repita as seguintes etapas:
- Remova qualquer vértice que não tenha arestas direcionadas recebidas nem arestas não direcionadas incidentes, pois não pode fazer parte de nenhum ciclo.
- Se qualquer vértice não tiver arestas direcionadas recebidas, mas tiver exatamente uma aresta não direcionada incidente, qualquer ciclo usando a aresta não direcionada deverá entrar nessa aresta. Substitua a borda não direcionada por uma borda direcionada de entrada.
Pare quando não for possível executar mais etapas. Se o resultado for um gráfico vazio, o gráfico original deve necessariamente ter sido acíclico. Caso contrário, a partir de qualquer vértice restante, é possível voltar ao gráfico, em cada etapa seguindo para trás por uma aresta de entrada ou seguindo uma aresta não direcionada que não é a usada para alcançar o vértice atual, até ver um vértice repetido. A sequência de arestas seguida entre a primeira e a segunda repetição desse vértice (na ordem inversa) forma um ciclo no gráfico misto.
O artigo da Wikipedia sobre gráficos mistos menciona gráficos mistos acíclicos, mas não menciona como testá-los, então eu gostaria de acrescentar algo sobre esse algoritmo, mas para isso eu preciso de uma referência publicada. Alguém pode me dizer onde ele (ou qualquer outro algoritmo para testar a aciclicidade) aparece na literatura?
fonte
Respostas:
Encontrar ciclos mistos em um gráfico misto é equivalente a encontrar ciclos direcionados elementares (de comprimento> = 3) no gráfico direcionado correspondente. O gráfico direcionado correspondente é obtido do gráfico misto, substituindo cada aresta não direcionada por duas arestas direcionadas apontando em direções opostas. Prova: (1) Cada ciclo direcionado elementar (de comprimento> = 3) no dígrafo corresponde diretamente a um ciclo misto no gráfico misto. (2) Cada ciclo misto no gráfico misto contém um ciclo misto elementar de comprimento> = 3, e cada um desses ciclos corresponde diretamente a um ciclo direcionado elementar (de comprimento> = 3) no gráfico direcionado. (1) e (2) juntos provam ambas as direções da afirmação, qed. Portanto, estamos procurando referências sobre como calcular (todos?) Ciclos elementares (de comprimento> = 3) em um gráfico direcionado.
Os comentários indicam que o cs.stackexchange contém algumas respostas para essa pergunta, mas não está claro como organizar os resultados em uma resposta concisa. Esta postagem do blog parece resumir bem as (mais?) Referências importantes:
O teste de aciclicidade parece ser fácil: calcule os componentes fortemente conectados do gráfico. Qualquer ciclo (elementar) está completamente contido em um componente fortemente conectado. Um componente fortemente conectado contém um ciclo elementar se não for uma árvore não direcionada.
O algoritmo proposto por David Eppstein calcula adicionalmente um ciclo elementar como evidência, e os algoritmos acima enumeram todos os ciclos elementares. Qualquer vértice ou aresta não contida em um ciclo elementar pode ser excluída como uma etapa de pré-processamento para melhorar a velocidade dos algoritmos acima. O algoritmo de David Eppstein pode ser usado para esse fim, mas mesmo se usado apenas em componentes fortemente conectados, ele não excluirá todos os vértices ou arestas possíveis que possam ser excluídos. Mas mesmo que pudesse ser estendido para isso (calcular a árvore cortada em bloco pelo menos permite excluir todos os vértices possíveis que podem ser excluídos), não está claro se isso realmente melhoraria a velocidade dos algoritmos acima.
fonte