Encontre os ciclos simples em um gráfico direcionado

15

Este problema, para mim, parece muito interessante. Ele estava prestes a encontrar um ciclo simples (isto é, ciclo onde não há nós repetidos) em um gráfico direcionado.

Minha solução está sendo assim, ou seja, este gráfico é um problema de caso: insira a descrição da imagem aqui

Eu sei que existe um ciclo em um gráfico, quando você pode encontrar "bordas traseiras" em uma pesquisa profunda (mostrada na minha foto no DFSTree) e, por um momento, posso garantir alguns ciclos, mas não por alguns. tudo, ciclos simples. Porque os egdes direcionados são tão importantes para um ciclo, ou seja (0123)! = (0321)

Estou pensando em fazer um DFS para cada nó com bordas traseiras, mas não tenho certeza e não está claro. Então, eu pergunto, se você me guiar. Obrigado!. insira a descrição da imagem aqui

Aqui está a minha contagem de loops simples para o meu problema de caso.

insira a descrição da imagem aqui insira a descrição da imagem aquiinsira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

jonaprieto
fonte
Eu encontrei este stackoverflow.com/questions/2939877/…
jonaprieto

Respostas:

13

Esta questão parece ser muito googleable. Por exemplo, você pode estar interessado no algoritmo apresentado neste documento:

Encontrando todos os circuitos elementares de um gráfico direcionado . Donald B. Johnson. SIAM J. COMPUT. Vol. 4, nº 1, março de 1975

Abstrato. É apresentado um algoritmo que encontra todos os circuitos elementares - de um gráfico direcionado no tempo limitado por O((n + e)(c + 1))e espaço limitado por O(n + e), onde existem nvértices, earestas e ccircuitos elementares no gráfico. O algoritmo se assemelha aos algoritmos de Tiernan e Tarjan, mas é mais rápido porque considera cada extremidade no máximo duas vezes entre qualquer circuito e o próximo na sequência de saída.

O artigo contém um algoritmo completo.

badroit
fonte
Está bem. O papel é perfeito, mas posso prosseguir com o meu trabalho ou apenas olhar o papel? Eu estava procurando por você para me apresentar a solução, o que estou esquecendo com a minha ideia?
jonaprieto
2
Seu principal problema é que a árvore dfs não é exclusiva (por exemplo, troque "1" por "3" em seu diagrama). Você precisaria examinar todas as árvores dfs possíveis para enumerar todos os ciclos.
badroit
11
Caso você precise de uma implementação Java desse algoritmo: github.com/1123/johnson
user152468
@badroit link is broken ... :(
Jorge E. Hernández
@alongooo, obrigado sim, eu o substituí.
badroit