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