看了网上很多博客,对于dfs和bfs还是理解的不是很清楚,记模板也并没有什么用,很快就会忘记。所以还是自己能够理解才能真正掌握。
1:dfs
dfs中最常用的方法就是递归和回溯了。
以油田问题为例(http://acm.hdu.edu.cn/showproblem.php?pid=1241),在油田问题中,我们相当于是仅仅需要遍历图形一次,所以我们只需要一直搜下去,一直搜下去,直到无路可走。如果是回溯的话,是因为我要找到的解,可能在我以前的路径当中。
void dfs(int s,int h) { int sx,sy; dis[s][h]=1; for(int x=0;x<8;x++) { sx=s+dir[x][0]; sy=h+dir[x][1]; if(maps[sx][sy]!='@'|| dis[sx][sy]==1) continue; dfs(sx,sy); } }
2:bfs
为什么bfs能解决最短路径问题,因为他是一层一层的遍历的,所以他是从在靠近源点的遍历,所以当我们在寻找最优解的时候,找到合适的,就一定是最优的解。因为我们是做的是先进来的先访问,所以肯定是需要用到队列的。