深度优先搜索(Depth-First-Search):
事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.
宽度优先搜索(Breadth First Search):
BFS,其英文全称是Breadth First Search。 BFS并不使用经验法则算法。从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。一般的实验里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如队列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表)
DFS和BFS的区别:
- DFS 使用的数据结构是栈(stack),而BFS 使用的数据结构是队列(queue) 。
- 在空间上来说,DFS 使用的空间与搜索的高度有关,而BFS的空间是高度的指数,所以DFS比BFS用的空间小
- BFS 的好处是搜索最短路,而DFS 不具最短路。
DFS例题:
全排列
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int n,path[N];
bool sta[N] ;
void dfs(int u)
{
if(u == n)
{
for(int i=0;i<n;i++)cout << path[i] <<' ';
cout<<endl;
return;
}
for(int i=1;i<=n;i++)
if(!sta[i])
{
path[u] = i ;
sta[i] = true ;
dfs(u+1);
sta[i] = false ;
}
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin >> n;
dfs(0);
return 0;
}
BFS例题
走迷宫
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef pair<int,int>PII;
const int N = 110;
int n,m,g[N][N],d[N][N];
PII q[N*N];
int bfs()
{
int hh = 0,tt = 0;
q[0] = {0,0};
memset(d,-1,sizeof d);
d[0][0] = 0;
int dx[4] = {-1,0,1,0},dy[4]= {0,1,0,-1};
while(hh <= tt)
{
auto t = q[hh ++ ];
for(int i=0;i<4;i++)
{
int x = t.first + dx[i] ,y = t.second + dy[i] ;
if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&d[x][y]==-1)
{
d[x][y] = d[t.first][t.second] + 1;
q[++tt] = {x,y};
}
}
}
return d[n-1][m-1];
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin >> n >> m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin >> g[i][j];
cout << bfs() << endl ;
return 0;
}
题目来自AcWing