關於遞歸深度優先搜索(DFS)常見的一個bug
概論:我想得到DFS遍歷一棵樹(非二叉樹,是一顆一般的樹)的頂點訪問順序,所以用鄰接矩陣表示這棵樹,用全局變量cur表示當前訪問的頂點序號,例如cur = 3,表示當前正在訪問第3個頂點。其他的重要變量有:數組vis,標記城市是否被訪問;數組cur,記錄訪問了的頂點;N,城市的數量。
bug是在一個應該用v的地方用了x[cur]。出錯的原因是因爲當回溯回去時,cur的值已經不是第一次進入函數的值了,因爲cur是全局變量。
正確代碼如下:
//adj是鄰接矩陣,v是當前要訪問的頂點
void DFS(int adj[][N], int v){
vis[v] = 1; //v是當前訪問的節點
x[cur] = v; //cur是正在訪問第幾個城市(從1開始)
if (N == cur) return;
for(int i = 0; i < N; ++i){
if(0 == vis[i] && 1 == adj[v][i]){
//錯誤版本是if(0 == vis[i] && 1 == adj[x[cur]][i]){
cur = cur+1;
DFS(adj,i);
}
}
}
關鍵是這句
if(0 == vis[i] && 1 == adj[v][i]){
//錯誤版本是if(0 == vis[i] && 1 == adj[x[cur]][i]){
//意圖表示頂點i未被訪問且它和當前訪問的頂點v是存在邊的