web-dev-qa-db-fra.com

Qu'est-ce qu'un algorithme pour trouver des cycles simples?

J'ai un graphique avec un cycle d'euréroien et non cycles hamiltoniens . Je voudrais diviser ce graphique en cycles simples.
Les bords peuvent ne pas être répétés dans des cycles simples.

Comment cela peut-il être fait?

6
user1027854

Si vous ne connaissez pas déjà le cycle d'eurerie, utilisez-le algorithme de Hierholzer .

(Édité de montrer comment trouver Tous Cycle simple dans le réseau, pas seulement ceux contenus dans la CE. Est-ce ce que le questionneur voulait?)

En supposant que vous connaissiez déjà un cycle d'eurerie, suivez simplement le cycle d'Eulérian. Chaque fois que vous visitez un nœud que vous avez déjà visité, vous avez trouvé un cycle. Vous devriez vérifier que c'est un Cycle simple En veillant à ce qu'il n'y ait pas d'autres répétitions dans ce cycle. Par example

A -> B -> C -> D -> B -> E -> A

A ... A est un cycle, et B -> B est un cycle, mais seul ce dernier est un cycle simple

En outre, deux cycles simples pourraient partager de nombreux nœuds et bords les uns avec les autres. Par example,

A -> X -> B -> Y -> A -> Z -> B

A ... A et B ... B sont des cycles simples qui partagent des nœuds et des bords les uns avec les autres.

= Recherche Tous Cycle simple dans le graphique =

Chaque cycle simple sera soit contenu avec le cycle d'Eulérian (CE), soit étalé dans tout le CE. Par exemple, de ce que je veux dire par "étalé", nous pouvons voir le cycle simple A -> B -> C -> A Au sein de cette CE:

D -> A ==> B -> E -> F -> B ==> C ==> A -> D

où j'ai mis en évidence des bords en les rendant plus longs. Ces bords font partie du cycle simple. Donc, donné et EC et le but de trouver tous Cycle simple, il s'agit d'énumérer tous les sous-ensembles des bords de la CE.

Mais vous pouvez accélérer considérablement les choses avec une simple observation. Si vous décidez d'inclure A->B Dans votre Cycle simple candidat, alors le bord suivant que vous décidez d'inclure doit commencer à b et que vous pouvez sauter sur de nombreux bords suivants. Cela devrait faciliter l'ignorer de nombreuses grandes parties de l'arbre de recherche.

En fait, je pense que cet algorithme est une efficacité optimale très optimale pour trouver tous les cycles simples. Des pensées?

0
Aaron McDaid