Meilleur algorithme pour la détection de cycles dans un graphe orienté

Ce qui est le plus efficace algorithme pour la détection de tous les cycles dans un graphe orienté?

J'ai un graphe orienté représentant un calendrier des travaux qui doivent être exécutés, d'un travail d'un nœud et d'une dépendance étant un avantage. J'ai besoin de détecter l'erreur le cas d'un cycle à l'intérieur de ce graphique conduisant à des dépendances cycliques.

  • Vous dites que vous voulez détecter tous les cycles, mais votre cas d'utilisation suggère qu'il serait suffisante pour détecter s'il y a des cycles.
  • Il serait préférable de détecter tous les cycles de sorte qu'ils pourraient être fixés en une fois, plutôt que de vérifier, corriger, vérifier, corriger etc.
  • Vous devriez lire le livre "Trouver tous les circuits élémentaires d'un graphe orienté" par Donald B. Johnson. Il va trouver de l'élémentaire circuits, mais cela devrait être suffisant pour votre cas. Et voici mon Java mise en œuvre de cet algorithme prêt à l'emploi: github.com/1123/johnson
  • Exécuter DFS avec d'autres modifications de l'algorithme: la marque de chaque nœud que vous avez visité. si vous visitez un nœud qui est déjà visités, alors vous avez un cicle. lorsque vous retraite à partir d'un chemin, enlever les nœuds qui sont visités.
  • si vous visitez un nœud que vous avez déjà visités, il n'est pas nécessairement l'existence d'une boucle. Merci de lire mon commentaire cs.stackexchange.com/questions/9676/....
  • Votre première phrase contredit votre dernière phrase; veuillez les corriger. Si vous voulez vraiment détecter tous les cycles (première phrase), votre pire des cas, la taille de sortie, et l'exécution, sera exponentielle par rapport à votre taille. Si vous voulez vraiment tout détecter l'erreur en cas de cycle (dernière phrase), vous pouvez le faire en temps linéaire en la taille de l'entrée. Je vous recommande le dernier.
  • non, il ne serait pas forcément meilleur pour détecter tous les cycles. Considérer le cas où il y a un nombre exponentiel d'entre eux.

InformationsquelleAutor Peauters | 2008-11-04