问题:
深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。其过程为:假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可以从图中的某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。
在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有顶点,输出遍历顶点的顺序。
输入:
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
输出:
只有一行,包含n个整数,表示按照题目描述中的深度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。
例如:
4
0 1 0 1
1 0 0 0
0 0 0 1
1 0 1 0
输出:
0 1 3 2
分析:
定义一个一维数组book,用来存储这个节点是否被访问过,初始为0,访问过为1
定义一个二维数组p,用来存储邻接表
开始的时候,从0开始,所以book[0]=1;
遍历邻接表每行的数据,碰到如果是1并且book[i]=0,就把book[i]变为1,并且继续从i进行dfs遍历,如果没有碰到,就返回
退出条件是step==n,就是走的步数==n,就退出
dfs:
void dfs(int k){
cout<<k<<" ";
step++;//每走一步step+1
if(step==n){
return;
}
for(int i=0;i<n;i++){
if(p[k][i]==1&&book[i]==0){//邻接矩阵是1,说明有连线,并且这个点没有被访问过
book[i]=1;
dfs(i);
}
}
return;
}
代码:
#include <iostream>
using namespace std;
int book[100]={0};//定义一个数组,看是否走过
int p[100][100];//定义邻接矩阵
int step=0,n;//记录每次走的步数
void dfs(int k){
cout<<k<<" ";
step++;//每走一步step+1
if(step==n){
return;
}
for(int i=0;i<n;i++){
if(p[k][i]==1&&book[i]==0){//邻接矩阵是1,说明有连线,并且这个点没有被访问过
book[i]=1;
dfs(i);
}
}
return;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>p[i][j];
}
}
book[0]=1;
//从0开始遍历
dfs(0);
return 0;
}
结果: