Trouver les cycles simples dans un graphique dirigé

15

Ce problème, pour moi, semble très intéressant. Il était sur le point de trouver un cycle simple (c'est-à-dire un cycle où ne sont pas des nœuds répétés) dans un graphe orienté.

Ma solution va comme ceci, c'est-à-dire que ce graphique est un problème de cas: entrez la description de l'image ici

Je sais qu'il y a un cycle dans un graphique, quand vous pouvez trouver des "bords arrières" dans une recherche en profondeur d'abord (en pointillés sur ma photo dans DFSTree), et pendant un moment, je peux en être sûr pendant quelques cycles, mais pas pour tous, des cycles simples. Parce que les egdes dirigés sont si importants pour un cycle, c'est-à-dire (0123)! = (0321)

Je pense à faire un dfs pour chaque nœud avec des arrières, mais je ne suis pas sûr et ce n'est pas clair. Alors, je vous demande, si vous me guidez. Merci!. entrez la description de l'image ici

Voici mon nombre de boucles simples pour mon problème de cas.

entrez la description de l'image ici entrez la description de l'image icientrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

jonaprieto
la source
J'ai trouvé ce stackoverflow.com/questions/2939877/…
jonaprieto

Réponses:

13

Cette question semble être très googleable. Par exemple, vous pourriez être intéressé par l'algorithme présenté dans cet article:

Trouver tous les circuits élémentaires d'un graphe orienté . Donald B. Johnson. SIAM J. COMPUT. Vol. 4, n ° 1, mars 1975

Abstrait. Un algorithme est présenté qui trouve tous les circuits élémentaires d'un graphe dirigé dans le temps délimité par O((n + e)(c + 1))et l'espace délimité par O(n + e), où il y a des nsommets, des ebords et cdes circuits élémentaires dans le graphe. L'algorithme ressemble aux algorithmes de Tiernan et Tarjan, mais il est plus rapide car il considère chaque front au plus deux fois entre un circuit et le suivant dans la séquence de sortie.

L'article contient un algorithme complet.

badroit
la source
D'accord. Le papier est parfait, mais puis-je aller n'importe où avec mon travail, ou simplement regarder le papier? Je cherchais pour vous me présenter la solution, qu'est-ce que j'oublie avec mon idée?
jonaprieto
2
Votre problème principal est que l'arborescence dfs n'est pas unique (par exemple, permutez "1" avec "3" dans votre diagramme). Vous auriez besoin de regarder tous les arbres DFS possibles pour énumérer tous les cycles.
badroit
1
Si vous avez besoin d'une implémentation Java de cet algorithme: github.com/1123/johnson
user152468
Le lien @badroit est rompu ... :(
Jorge E. Hernández
@lalongooo, merci oui, je l'ai remplacé.
badroit