Trouver tous les cycles dans le graphe, redux
Je sais qu'il y a assez peu de réponses existantes sur cette question. Cependant, je l'ai trouvé aucun d'entre eux vraiment mettre au point.
Certains prétendent qu'un cycle est (presque) la même chose qu'un fortement les composants raccordés (s). Trouver tous les cycles dans un graphe orienté) , donc on peut utiliser des algorithmes conçus pour cet objectif.
Certains font valoir que la conclusion de un cycle peut être fait par DFS et de contrôle pour le dos-bords (s). boost graph de la documentation sur les dépendances des fichiers).
Maintenant, je voudrais avoir quelques suggestions que tous cycles dans un graphe peuvent être détectés par DFS et de contrôle pour le dos-bords?
http://www.me.utexas.edu/~bard/IP/Documents/cycles.pdf (trouvé ici sur S. O.) - une autre methode basée sur le cycle de bases. Moi, personnellement, je ne trouve pas ça très intuitif donc je suis à la recherche d'une solution différente.
EDIT: Mon avis initial a été apparemment mal. S. ensuite répondre par "Idiot".
Initiale avis:
Mon avis est qu'il pouvait, en fait, travailler de cette façon que DFS-VISITE. pseudo-code de DFS) fraîchement entre chaque nœud qui n'a pas encore visité. En ce sens, chaque sommet présente un potentiel de début de cycle. En outre, comme DFS visites chaque bord une fois, chaque bord vers le point de départ d'un cycle est également couvert. Ainsi, à l'aide de DFS et le dos-bord de la vérification, il devrait en effet être possible de détecter tous cycles dans un graphe. Notez que, si les cycles avec différents nombres de participant nœuds existent (par exemple des triangles, des rectangles, etc.), le travail supplémentaire doit être fait pour discriminer les acutal "forme" de chaque cycle.
OriginalL'auteur Shadow | 2010-05-15
Vous devez vous connecter pour publier un commentaire.
J'ai déjà répondu à cette profondeur, afin de vérifier ceci:
Une source à l'enlèvement de la sorte toujours de retour maximale du cycle?
La partie pertinente de la réponse:
OriginalL'auteur Dimitris Andreou
Peut-être cela peut vous aider en quelque sorte, j'ai trouvé cette site où une couleur de dfs pour un graphe orienté est décrite. Ainsi, vous pouvez envisager de corriger le dfs traduction en php que je présente ici.
Ce que j'ai ajoutée est une pièce pour créer une forêt et une autre partie pour trouver tous les cycles. Veuillez donc considérer qu'il n'est pas sûr de prendre ces deux parties de mon code correct pour vous.
Un avec des connaissances sur la théorie des graphes peut être en mesure de tester pour vous. Il n'y a pas de commentaires dans le dfs partie parce qu'il est déjà décrit dans le site de référence. Je vous suggère de prendre un exemple avec plus d'un arbre et de dessiner la forêt (besoin de 4 couleurs) dans un article pour mieux comprendre.
C'est le code:
Et c'est la sortie:
EDIT 1 :
Le
back_edge_exploit
méthode pourrait être erplaced par cette version:EDIT 2:
Je dois dire que j'ai trouvé que
back_edge_exploit
est insuffisante, elle ne pourra trouver cycles qui sont faits avec des arbres des bords et un bord arrière.**** Edit 3: ****
Bien que ces solutions est incomplète, il dispose de quelques informations utiles, même l'insuffisance de soi est un élément d'information, donc je pense qu'il pourrait être utile de le garder. Mais la principale raison pour laquelle j'ai édité ma réponse est que j'ai trouvé une autre solution que je vais vous présenter ci-dessous.
Mais avant cela, un autre avis peut être faite à propos de la dfs approche, il y a des cycles qui pourrait se produire par la marche n'importe quelle combinaison valide toutes les croix de l'avant,arbre,bord arrière. Afin de trouver le réel cycles en s'appuyant sur les informations de dfs n'est pas trivial (nécessite un code supplémentaire), pensez à
cet exemple:
Aussi longtemps que la nouvelle solution est concernée, elle est décrite dans un vieux livre de 1970, par James C. Tiernan (Suivez ce lien) comme un algorithme efficace pour la recherche de tous les cycles élémentaires dans un graphe orienté. Il y a aussi un moderne mise en œuvre du présent sans goto Voir ici
Mon de la mise en œuvre du Cycle Élémentaire de l'Algorithme (c'est le nom) est en php et est aussi proche que possible de l'original . J'ai déjà vérifié et il fonctionne. C'est sur les graphes orientés, si vous déclarez graphique de sorte qu'il est dirigé cycle v1->v2->v3 et v2->v3->v1 puis les deux cycles seront trouvés ce qui est logique puisqu'il fonctionne sur les graphes orientés.
Comme pour les graphes non dirigés, l'auteur propose d'autres algorithmes qui font une meilleure solution que de modifier les algorithmes, mais il peut être fait en modifiant le graphe de définition et par l'ajout d'une vérification supplémentaire pour les cycles de longueur 2 qui sont considérés comme non-orienté bords. En particulier, un non-orienté cycle de trois noeuds seraient définies deux fois, dans la définition, à la fois par l'orientation, comme ceci: v1->v2->v3 et v3->v2->v1. Ensuite, l'algorithme va trouver deux fois, une fois par orientation, alors une modification d'une seule ligne sur
EC3_Circuit_Confirmation
pouvez couper le plus.Les nœuds sont définis de manière séquentielle, on peut changer la constante
first
et la liste d'adjacence de faire le premier nœud de compter à partir de zéro ou un.C'est le code php pour la CE, l'Algorithme de Tiernan :
OriginalL'auteur Melsi
Ma suggestion est d'utiliser l'algorithme de Tarjan pour trouver ensemble des composantes fortement connexes, et Hierholzer de l'algorithme pour trouver tous les cycles dans la composante fortement connexe.
Voici le lien pour l'implémentation de Java avec un cas de test:
http://stones333.blogspot.com/2013/12/find-cycles-in-directed-graph-dag.html
OriginalL'auteur stones333
Si une traversée de l'algorithme de visites chaque bord qu'une seule fois, alors il ne peut pas trouver tous les cycles. Un tronçon peut faire partie de plusieurs cycles.
btw, ce qui est un arrière-edge?
Aussi, peut-être vous devriez reformuler/format de votre question. Il est très difficile à lire.
Désolé, je dois corriger moi-même et d'accord avec vous "Débile". J'ai limité mon "cycles" de triangles lors de l'exploration d'exemples et de se concentrer fortement sur la détection de ces triangles. Cela signifie que l ' "algorithme" toujours suivi les bords qui mènent directement à triangles, bien que ce ne doit pas être le cas. E. g. Les 2 triangles, le partage d'un bord (plus grand cycle = rectangle), le rectangle peut être découvert d'abord comme un cycle, et les 2 triangles peut-être manqué. Et vice-versa.
OriginalL'auteur