今天又复习了图的深度优先搜索,深深感觉了深搜就是外挂,岂止是外挂,简直就是外挂,动态规划做不出来的,深搜搜出来了,贪心贪不出来的深搜搜出来了,连并查集,拓扑排序做不出来的,深搜都做出来了,很遗憾以前深搜没有好好学。
深度优先搜索(Depth-First-Search)是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜索。
事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.
深搜主要的是一个回溯的过程,标记当前的点已经用过,在用过的基础上,进行下一步,当进行到了最后发现此点不能用,于是就回溯回来,因此造成了该算法的时间复杂度为(O(n!));很容易造成超时,但是在部分题内,盲目搜索遍历一遍也挺挺快的,基本都是0ms,此算法,代码容易写,容易想,怪不得研究出dfs的两位神得了图灵奖,真6;
oj上边有很多适合练习深搜的题,如hdoj1045,还有最经典的n皇后问题,hdoj1258,南阳32组合数问题,南阳oj58最小步数问题,hdoj1016素数环问题,poj2362,zoj1003...(由于题目过多,只列取了经典的);
附几道深经典搜题及代码:
组合数问题:
描述
-
输入
- 输入n、r。 输出
-
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。 样例输入
-
5 3
样例输出
-
543 542 541 532 531 521 432 431 421 321