遞歸深度優先搜索(DFS)常見的一個bug

關於遞歸深度優先搜索(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是存在邊的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章