Étant donné la recherche en profondeur suivante, pourquoi la vérification if(Parent[currVertex] != successorVertex)
dans la méthode ProcessEdge détecte-t-elle un cycle ? Ce code suit l'algorithme donné dans le livre Algortim Design Manual de S.Skiena. Il est possible que la vérification soit une faute de frappe et qu'elle soit censée être if(Parent[successorVertex] != currVertex)
. Veuillez demander toute clarification. Je suis vraiment bloqué(e) à ce sujet.
public void Search(int start)
{
/* REMARQUE : les différences par rapport au BFS sont : ceci utilise une pile au lieu d'une file ET ceci maintient la variable 'temps' */
Stack s = new Stack();
int currVertex;
int successorVertex;
int time = 0;
s.Push(start);
Discovered[start] = true;
while (s.Count != 0)
{
currVertex = s.Pop();
// Le temps augmente à chaque fois que nous entrons dans un sommet (lorsqu'il est découvert) et à chaque fois que nous quittons un sommet (lorsqu'il est traité en retard, c'est-à-dire lorsque tous ses voisins ont été traités)
time++;
EntryTime[currVertex] = time;
ProcessVertexEarly(currVertex);
Processed[currVertex] = true;
for (int i = 0; i < Graph.Vertices[currVertex].Count; i++)
{
successorVertex = Graph.Vertices[currVertex][i].Y;
if (!Processed[successorVertex] || Graph.IsDirected)
{
ProcessEdge(currVertex, successorVertex);
}
if (!Discovered[successorVertex])
{
s.Push(successorVertex);
Discovered[successorVertex] = true;
Parent[successorVertex] = currVertex;
}
}
// Le temps augmente à chaque fois que nous entrons dans un sommet (lorsqu'il est découvert) et à chaque fois que nous quittons un sommet (lorsqu'il est traité en retard, c'est-à-dire lorsque tous ses voisins ont été traités)
time++;
ExitTime[currVertex] = time;
ProcessVertexLate(currVertex);
}
}
private void ProcessEdge(int currVertex, int successorVertex)
{
if(Parent[currVertex] != successorVertex) // alors nous avons trouvé un cycle
{
/* Cycle trouvé */
}
}
MISE À JOUR
Correction trouvée pour ce code dans l'errata http://www.cs.sunysb.edu/~skiena/algorist/book/errata. Voir (*) Page 173, procédure process_edge -- le test correct devrait être
if (discovered[y] && (parent[x] != y)) { /* arête de retour trouvée */
Mais est-ce que cela détectera les cycles ?? La vérification if ne passera jamais car dans la méthode DFS, process_edge
n'est appelée que lorsque discovered[y] == false
.