题目描述
以邻接矩阵给出一张以整数编号为顶点的图,其中0表示不相连,1表示相连。按深度和广度优先进行遍历,输出全部结果。要求,遍历时优先较小的顶点。如,若顶点0与顶点2,顶点3,顶点4相连,则优先遍历顶点2.
输入
顶点个数
邻接矩阵
输出
DFS
深度遍历输出
WFS
广度遍历输出,
样例输入
3
0 1 1
1 0 1
1 1 0
样例输出
DFS
0 1 2
1 0 2
2 0 1
WFS
0 1 2
1 0 2
2 0 1
代码
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
void Print(int a)//输出函数
{
cout<<a<<" ";
}
void DeepFirstTravel(int start,int **Tlist,int n,int visit[])
{
Print(start);
visit[start]=1;//标记已经走过
for(int i=0; i<n; i++)//递归停止的条件就是最后一个递归for循环走完
{
if(Tlist[start][i]!=0&&visit[i]!=1)
DeepFirstTravel(i,Tlist,n,visit);
}
}
void BreadthFirstTravel(int start,int **Tlist,int n,int visit[])
{
queue<int> q;
Print(start);
visit[start]=1;
q.push(start);
int cur;
while(!q.empty())
{
cur=q.front();
q.pop();
for(int i=0; i<n; i++)
{
if(Tlist[cur][i]!=0&&visit[i]!=1)//先访问、标记,再入队
{
Print(i);
visit[i]=1;
q.push(i);
}
}
}
}
int main()
{
int n;
cin>>n;
int **a;//邻接矩阵
int *visit;//标记数组
a=new int*[n];
for(int i=0; i<n; i++)
{
a[i]=new int[n];
}
visit=new int[n];
for(int i=0;i<n;i++)
visit[i]=0;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cin>>a[i][j];
}
cout<<"DFS"<<endl;
for(int i=0; i<n; i++)
{
DeepFirstTravel(i,a,n,visit);
cout<<endl;
for(int i=0; i<n; i++)
visit[i]=0;
}
cout<<"WFS"<<endl;
for(int i=0; i<n; i++)
{
BreadthFirstTravel(i,a,n,visit);
cout<<endl;
for(int i=0; i<n; i++)
visit[i]=0;
}
}