文中程序摘自:https://blog.youkuaiyun.com/qq_36525906/article/details/77387717
DFS算法-Depth-First Search
深度优先搜索:
- 遍历类似于树的先根遍历
- 使用栈保存未被检测的结点,结点按照深度优先的顺序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测
- 深度优先搜索举例:走迷宫,没有办法用分身术站姿每个走过的位置,不撞南墙不回头系列
- 基本模板
int check(参数)
{
if(满足条件)
return 1;
return 0;
}
void dfs(int step)
{
判断边界
{
相应操作
}
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯的时候要用到)
}
}
#include<iostream>
using namespace std;
int a[11][11];
bool visited[11];
void store_graph() //邻接矩阵存储图
{
int i,j;
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
cin>>a[i][j];
}
void dfs_graph() //深度遍历图
{
void dfs(int v);
memset(visited,false,sizeof(visited));
for(int i=1;i<=10;i++) //遍历每个顶点是为了防止图不连通时无法访问每个顶点
if(visited[i]==false)
dfs(i);
}
void dfs(int v) //深度遍历顶点
{
int Adj(int x);
cout<<v<<" "; //访问顶点v
visited[v]=true;
int adj=Adj(v);
while(adj!=0)
{
if(visited[adj]==false)
dfs(adj); //递归调用是实现深度遍历的关键所在
adj=Adj(v);
}
}
int Adj(int x) //求邻接点
{
for(int i=1;i<=10;i++)
if(a[x][i]==1 && visited[i]==false)
return i;
return 0;
}
int main()
{
cout<<"初始化图:"<<endl;
store_graph();
cout<<"dfs遍历结果:"<<endl;
dfs_graph();
return 0;
}
BFS算法-Breadth-First Search
广度优先算法:
- 遍历类似于树的按层次遍历
- 使用队列保存未被检测的结点,结点按照宽度优先的顺序被方位和进出队列
- 广度优先算法举例:当你的眼睛掉到地上后,趴在地板上找,总是先摸最接近自己的地方,如果没有再摸远一点的地方
#include<iostream>
#include<queue>
using namespace std;
int a[11][11];
bool visited[11];
void store_graph()
{
for(int i=1;i<=10;i++)
for(int j=1;j<=10;j++)
cin>>a[i][j];
}
void bfs_graph()
{
void bfs(int v);
memset(visited,false,sizeof(visited));
for(int i=1;i<=10;i++)
if(visited[i]==false)
bfs(i);
}
void bfs(int v)
{
int Adj(int x);
queue<int> myqueue;
int adj,temp;
cout<<v<<" ";
visited[v]=true;
myqueue.push(v);
while(!myqueue.empty()) //队列非空表示还有顶点未遍历到
{
temp=myqueue.front(); //获得队列头元素
myqueue.pop(); //头元素出对
adj=Adj(temp);
while(adj!=0)
{
if(visited[adj]==false)
{
cout<<adj<<" ";
visited[adj]=true;
myqueue.push(adj); //进对
}
adj=Adj(temp);
}
}
}
int Adj(int x)
{
for(int i=1;i<=10;i++)
if(a[x][i]==1 && visited[i]==false)
return i;
return 0;
}
int main()
{
cout<<"初始化图:"<<endl;
store_graph();
cout<<"bfs遍历结果:"<<endl;
bfs_graph();
return 0;
}