DFS+BFS题目一百例——从入门到入土

标题是假的,题目自己找,这里只有一些想法。

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,堆栈和队列,那么和递归同等的又是什么呢?

你可能感兴趣的:(DFS+BFS题目一百例——从入门到入土)