邻接矩阵的BFS和DFS(简明版)
DFS递归(深优)<伪代码>:
1.打印并标记顶点v
2.1查找与顶点v相连j且未被标记(访问)的顶点j
2.1深度遍历j
BFS(广优)<伪代码>:
1.打印并标记顶点v,入队
2.只要队列不为空
2.1查找与顶点v相连j且未被标记(访问)的顶点j
2.2输出顶点j并入队
代码:
#include<iostream>#include<cstring>
#include<queue>
#include<stack>
using namespace std;
#define Max 10
char vertex[4]={'a','b','c','d'};//顶点
int visited[Max],arc[Max][Max];
void DFS(int v)//非递归算法
{
stack<int> s;
cout<<vertex[v]<<" ";visited[v]=1;
s.push(v);
while(!s.empty())
{
v=s.top();
for(int j=0;j<4;j++)//只要v顶点下有指向未访问顶点j的边就继续访问
{
if(arc[v][j]==1&&visited[j]==0)
{
cout<<vertex[j]<<" ";visited[j]=1;s.push(j);v=j;j=0;
}
}
s.pop();
}
}
void DFSa(int v)//递归算法
{
cout<<vertex[v]<<" ";visited[v]=1;
for(int j=0;j<4;j++)
{
if(arc[v][j]==1&&visited[j]==0) DFSa(j);
}
}
void BFS(int v)
{
queue<int> q;
cout<<vertex[v]<<" ";visited[v]=1;
q.push(v);
while(!q.empty())
{
v=q.front();q.pop();
for(int j=0;j<4;j++)有边与顶点V连且顶点可访问
if(arc[j][v]==1&&visited[j]==0)
{
cout<<vertex[j]<<" ";visited[j]=1;q.push(j);//访问后入队方便后续遍历
}
}
}
int main()
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
arc[i][j]=0;
}
arc[0][1]=1;arc[0][3]=1;
arc[1][0]=1;arc[1][2]=1;arc[1][3]=1;
arc[2][1]=1;
arc[3][0]=1;arc[3][1]=1;
cout<<"打印邻接矩阵:"<<endl;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
cout<<arc[i][j]<<" ";
if(j==3) cout<<endl;
}
cout<<"打印顶点:"<<endl;
for(i=0;i<4;i++) cout<<vertex[i]<<" ";
cout<<endl;
for(i=0;i<Max;i++) visited[i]=0;//初始化
cout<<"BFS:"<<endl;
BFS(0);
cout<<endl;
for(i=0;i<Max;i++) visited[i]=0;//重置
cout<<"DFS<递归>:"<<endl;
DFSa(0);
cout<<endl;
for(i=0;i<Max;i++) visited[i]=0;//重置
cout<<"DFS<非递归>:"<<endl;
DFS(0);
cout<<endl;
return 0;
}
截图: