我試圖使用遞歸方法實現基於深度優先搜索的兩個函數。我最終試圖將運行時與warshall的算法(我已經工作)進行比較。當我打印我的矩陣時,它會被一對關閉的路徑關閉。遞歸查找圖矩陣DFS中的所有路徑DFS
遞歸是什麼可能會把我扔掉,這是我的弱點。由於頂部if語句if(iIndex1 == iIndex2) return TRUE;
,當我嘗試查找是否存在來自(A,A),(B,B),(C,C)等的路徑時,即使沒有路徑,我也將始終獲得1
從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
}
}
}
它應該是
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
我得到什麼
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
「錯誤的結果」:*錯誤*以哪種方式?順便說一句,儘量保持對'{}'的使用一致(我建議始終使用它們,即使對於單語句循環),並且:如果遞歸是答案,那麼通常像C這樣的絕大多數命令式語言不是選擇工具。 –
@MarcusMüller我通過使用warshall的算法知道最終的矩陣應該是什麼。我使用這個來比較它通過這個方法得到的矩陣結果。該矩陣顯示1的地方應該是0,反之亦然。只有大約一半是準確的。 –
@hnefatl遞歸函數用於確定從iIndex1節點到iIndex2節點的圖形中是否存在路徑,這是基於DFS算法的。需要for循環來檢查所有相鄰節點。我還需要在找到它們時標記訪問的節點。 –