J'essaie d'implémenter deux fonctions basées sur Depth First Search en utilisant une méthode de récurrence. J'essaie finalement de comparer l'exécution contre l'algorithme de warshall (que j'ai déjà travaillé). Quand j'imprime ma matrice, elle est coupée par deux chemins.La récursion trouve tous les chemins dans la matrice de graphe DFS
La récursivité est ce qui peut me jeter, c'est ma faiblesse. En raison de l'instruction top if if(iIndex1 == iIndex2) return TRUE;
, quand j'essaie de trouver s'il y a un chemin de (A, A), (B, B), (C, C), etc. Je vais toujours obtenir 1
même s'il n'y a pas de chemin de a à A.
typedef enum { FALSE, TRUE } bool;
/* Recursive function will determine if there is a path from index 1 to 2
* Based of DFS
*/
bool recPathExists(Graph G, int iIndex1, int iIndex2)
{
int j;
G.nodeArray[iIndex1].visited = TRUE;
if(iIndex1 == iIndex2){
return TRUE;
}
for(j = 0; j < G.iNumNodes; j++){
if(!G.nodeArray[j].visited && G.adjMatrix[iIndex1][j]==1){
if(recPathExists(G, j, iIndex2))
return TRUE;
}
}
return FALSE;
}
/* Write a function to find all pairs of nodes which have paths between them.
* Store this information in the provided pathMatrix.
*/
void allPathsRecFunc(Graph G , int **pathMatrix)
{
int i, j;
for(i = 0; i < G.iNumNodes; i++){
for(j = 0; j < G.iNumNodes; j++){
if(recPathExists(G, i , j)== TRUE){
pathMatrix[i][j] = 1;
}
resetVisited(G); //resets all nodes to FALSE
}
}
}
ce qu'elle devrait être
A 0 1 1 1 1 1 1 1
B 0 1 0 0 1 1 1 1
C 0 1 0 0 1 1 1 1
D 0 0 0 0 0 0 0 0
E 0 0 0 0 0 0 0 0
F 0 1 0 0 1 1 1 1
G 0 1 0 0 1 1 1 1
H 0 1 0 0 1 1 1 1
ce que je reçois
A 1 1 1 1 1 1 1 1
B 0 1 0 0 1 1 1 1
C 0 1 1 0 1 1 1 1
D 0 0 0 1 0 0 0 0
E 0 0 0 0 1 0 0 0
F 0 1 0 0 1 1 1 1
G 0 1 0 0 1 1 1 1
H 0 1 0 0 1 1 1 1
"mauvais résultats": * faux * de quelle façon? En passant, essayez d'être cohérent sur l'utilisation de '{}' (je recommande de toujours les utiliser, même pour les boucles à une seule instruction), et: si la récursivité est la réponse, généralement un langage essentiellement impératif comme C n'est pas le outil de choix. –
@ MarcusMüller Je sais ce que devrait être la matrice finale en utilisant l'algorithme de warshall. J'utilise ceci pour le comparer aux résultats de la matrice que je traverse cette méthode. La matrice montre des 1 où certains 0 devraient être et vice versa. Seulement environ la moitié est exacte. –
@hnefatl Une fonction récursive est utilisée pour déterminer s'il existe un chemin dans le graphe depuis le noeud au niveau de l'iIndex1 jusqu'au noeud à l'index i2, en fonction de l'algorithme sur DFS.Une boucle for est nécessaire pour vérifier tous les nœuds adjacents. Je devrai également marquer les nœuds visités comme je les trouve. –