一.BFS
1.BFS介绍
BFS又称宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索之一。这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了宽度优先搜索类似的思想。BFS属于一种盲目搜索法,目的是系统的展开并检查图中的所有节点,以找寻结果。它并不考虑结果的可能位置,彻底的搜索整张图知道找到结果为止。
2.BFS流程
广度优先遍历,指的是从图的一个未遍历的节点出发,遍历这个节点的相邻节点,再依次遍历每个相邻结点的相邻节点。
上述的广度优先遍历图如下:
先便历第一层再遍历第二层、第三层、第四层......
3,BFS一般解决的问题有:
(1):二叉树层序搜索遍历(各种变形例如分层输出、之字形等等空间优化)
(2):无权图的最短路径
(3):其他的迷宫搜索问题(节点带某些权值的)
4,BFS代码实现
#include<iostream>
#include<vector>
#include<queue>
namespace algo
二:DFS
1,DFS又称深度优先遍历,即深度越大的节点会被优先扩展。在DFS中使用栈数据结构来实现上述特征。
2,DFS流程:
(1):某个结点开始先按照一个方向遍历到尽头,同时标记已经走过的点。
(2):遍历到尽头后退回到上一个点,同时清除当前的标记。往下一个方向遍历一次,然后重复步骤(1)。
(3):一直到所有流程走完,即退回到起点。
注意:
在遍历的过程中需要标记 因为不进行标记会出现死循环,标记就代表这个点被用过不能用了,而撤回标记就说明这个点又能重新使用了
大致访问顺序为:
3,DFS一般解决的问题有:
(1):剪枝问题(剪掉没必要的搜索)
(2):记忆化(防止太多重复操作)
4,DFS代码实现
#include<stdio.h>
int a[10],book[10],n;
void dfs(int step)
{
int i;
if(step==n+1)
{
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("\n");
}
return ;//作用是返回上一级的dfs函数而不是返回主函数
}