Comment pouvons-nous détecter si un graphique dirigé est cyclique? Je pensais utiliser d'abord la première recherche de la largeur, mais je ne suis pas sûr. Des idées?
Habituellement, la première recherche de la profondeur est utilisée à la place. Je ne sais pas si BFS est applicable facilement.
Dans DFS , une arborescence étendue est construite dans l'ordre de visiter. Si un ancêtre d'un nœud dans l'arborescence est visité (c'est-à-dire un back-sort), puis nous détectons un cycle.
Voir http://www.cs.nyu.edu/courses/summer04/g22.1170-001/6a-graphes-more.pdf Pour une explication plus détaillée.
Je crois que vous avez vraiment besoin, c'est un algorithme de tri topologique comme celui décrit ici:
http://fr.wikipedia.org/wiki/topological_sorting
Si le graphique dirigé a un cycle, l'algorithme échouera.
Les commentaires/répons que j'ai vu jusqu'à présent semblent manquer du fait que dans un dirigé , il peut y avoir plus d'un moyen d'obtenir de Node X au nœud Y sans y être des cycles (dirigés) dans le graphique.
Utilisez dfs pour rechercher si un chemin est cyclique
class Node<T> { T value; List<Node<T>> adjacent; }
class Graph<T>{
List<Node<T>> nodes;
public boolean isCyclicRec()
{
for (Node<T> node : nodes)
{
Set<Node<T>> initPath = new HashSet<>();
if (isCyclicRec(node, initPath))
{
return true;
}
}
return false;
}
private boolean isCyclicRec(Node<T> currNode, Set<Node<T>> path)
{
if (path.contains(currNode))
{
return true;
}
else
{
path.add(currNode);
for (Node<T> node : currNode.adjacent)
{
if (isCyclicRec(node, path))
{
return true;
}
else
{
path.remove(node);
}
}
}
return false;
}
approche: 1
[.____] Que diriez-vous d'un niveau aucune affectation pour détecter un cycle. Par exemple: considérez le graphique ci-dessous. A -> (B, C) B-> D D -> (E, F) E, F -> (g) E-> D Lorsque vous effectuez une DFS commencez à attribuer un niveau NON au nœud que vous visitez (racine A = 0). Niveau de nœud = parent + 1. Donc, A = 0, B = 1, D = 2, F = 3, G = 4 Ensuite, la récursivité atteint D, donc e = 3. Ne marquez pas le niveau de g (g déjà un niveau de niveau non attribué qui est une râpe à la râle que E), il a également un bord à D. de sorte que le niveau de nivellement da devrait obtenir un n ° de niveau 4. mais D a déjà un "niveau inférieur" attribué Pour cela de 2. Ainsi, chaque fois que vous essayez d'attribuer un numéro de niveau à un nœud lors du fait de DFS qui a déjà un numéro de niveau inférieur à celui-ci, vous savez que le graphique dirigé a un cycle ..
approche2:
[.____] Utilisez 3 couleurs. Blanc, gris, noir. Couleur uniquement des nœuds blancs, des nœuds blancs à gris pendant que vous descendez les DFS, des nœuds gris de couleur au noir lorsque la récursivité se déroule (tous les enfants sont traités). Sinon, tous les enfants ne sont pas encore traités et que vous avez frappé un nœud gris c'est un cycle. Par exemple: tout blanc pour commencer dans le graphique direct ci-dessus. Les couleurs A, B, D, F, G sont colorées de gris blanc. G est la feuille de sorte que tous les enfants traitéent la couleur gris au noir. Récursion se déroule à F (tous les enfants traités) de la couleur noire. Maintenant, vous atteignez d, d n'a pas d'enfants non transformés, alors couleur E gris, g déjà coloré noir alors ne va donc pas plus loin. E a également un bord à D, donc tout en le traitement de D (D encore gris), vous trouverez un bord de retour à D (nœud gris), un cycle est détecté.
Les tests de tri topologique sur le graphique donné vous mèneront à la solution. Si l'algorithme de topsort, c'est-à-dire que les bords doivent toujours être dirigés d'une manière étant en échec, alors cela signifie que le graphique contient des cycles.