标题是假的,题目自己找,这里只有一些想法。
DFS借助递归(堆栈)实现,递归的参数尽量精简,一般包括递归层级和当前状态。为了方便记忆化搜索,参数尽量简洁,可以借助全局变量减少参数。
利用递归(堆栈)的性质(FILO),进行状态标记,用完当前的状态后就当无事发生,就像渣男一样。
vis[i]=1;//改变当前状态 dfs(t+1);//压入堆栈 vis[i]=0;//就当无事发生
BFS借助队列实现,队列的参数为合适的结构体,参数和DFS类似。类似的,能用全局变量就不要加入结构体。
利用递归(堆栈)的性质(FIFO),进行状态标记,用完当前的状态后就当无事发生,就像渣男一样。
tmp=pre=qu.top();//两个结构变量tmp,pre qu.pop(); tmp.x++;//改变当前状态 qu.push(tmp);//压入队列 tmp=pre;//就当无事发生
对比发现上面的过程都差不多,DFS以递归的形式省下了几行堆栈操作的代码。
简单的DFS和BFS都只会经过一遍所有的路径,所以时间复杂度都是O(N)。(N为状态总数,以长为a宽为b的矩阵为例,N=ab)
然而,由于BFS一层一层搜索的性质,寻找“最短”、“最快”、“最少”的条件更加方便,和一些最短路算法联系紧密。
类似的,由于DFS从头到尾搜索的性质,更适合用在连通性问题中,和并查集联系紧密。
做题之余,不妨(必须)思考一下二者的异同。
DFS和BFS,堆栈和队列,那么和递归同等的又是什么呢?
原文:https://www.cnblogs.com/World-of-Hile/p/10615763.html