文章目录
广泛用到BFS和DFS,我经常混淆的地方是:究竟是在哪里判断是否被访问过if(vised[node])?
建议:如果是BFS:在出队后进行判断。我有时候的顾虑是想着不要重复入队,所以在入队前进行判断vised即在for循环里面判断,如果已经被访问,就不入队,如果没被访问,就入队。
如果是DFS:在for循环外面进行判断,比如模板:
void DFS(node){
if(vised[node]){//在for循环外面判断
return;
}
vised[node]=true;
for(auto node2:graph[node]){
//if(vised[node2]) {continue;} //建议不要在这里判断
DFS(node2);
}
}
下述代码是210题课程表II的解题,我一开始把dfs中的vised判断写到了for循环里,但是onpath的判断又写到了for循环外面,导致我existCycle值恒为false,从而导致答案错误。后来把onpath的判断移动到for循环内,就解决这个问题了。
下面是labuladong对这道题的写法: