dfs函数中的问题
来源:7-6 寻路
the__sky123
2018-11-14
void dfs(int v) {
visited[v] = true;
id[v] = ccount;
for(int i : G.adj(v)) {
if(!visited[i])
dfs(i);
}
}
还是不能理解这个方法,我在debug时,就使用的演示中的图,在对1进行迭代,找到与1相连的是[ 0] ,然而在if语句中 [visited[0] 已经被遍历过,所以不进入if循环,在if外没有任何代码,在下次循环时,debug中显示v = 0 , 请问v是如何完成回溯,从1跳回到0的
写回答
3回答
-
如果你初始调用的是dfs(1),0肯定是从1遍历过去的。
如果如你所说,从1到0,0已经访问过了的话,肯定之前从别的节点访问过0。你说"然而在if语句中 [visited[0] 已经被遍历过",0是在哪里遍历的?在debug一下,看看什么时候visited[0]设的true?(我怀疑你的初始调用是dfs(0),所以一上来0就遍历过了。)
可以在这个函数中添加各种cout,来查看函数的行为,比如:
void dfs(int v) { cout << "访问" << v << "!" << endl; visited[v] = true; cout << "将 visited[" << v << "] 设为true" << endl; id[v] = ccount; for(int i : G.adj(v)) { cout << "从" << v << "到" << i << endl; if(!visited[i]) cout << i << "没有访问过!准备访问" << i << endl; dfs(i); cout << "从" << v << "到" << i << "遍历完,回到" << v << endl; } else{ cout << i << "已经访问过!" << endl; } cout << v << "的所有相邻节点已经遍历完毕!" << endl; }
再通过debug,看看上面的输出是什么顺序如何一句一句输出出来的?
如果有必要的化,让图更简单一些,节点更少,看能不能理解?
加油!:)
022018-11-14 -
the__sky123
提问者
2018-11-14
老师你明白我的意思了吗? 我的意思是从22行跳到17行,v就从1变成0了 ,不太懂这是什么原理
012018-11-14 -
the__sky123
提问者
2018-11-14
这个时候是1,但
在这之后v就变成0了,我是不太懂,dfs里没有对v的赋值操作,而且如果此点被访问过后就不会再访问了,所以在代码中也没有看到对v的操作,但v却一直在变化
022018-11-14
相似问题