深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。其过程为:假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可以从图中的某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。
输入格式:
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
输出格式:
只有一行,包含n个整数,表示按照题目描述中的深度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。
限制:
空间限制:32MByte 时间限制:1秒
样例:
输入: 4 0 1 0 1 1 0 0 0 0 0 0 1 1 0 1 0
输出: 1 2 4 3
#include "iostream"
using namespace std;
const int N = 1e2;
int g[N][N];//邻接矩阵
int flag[N];//标记数组
int n;
void dfs(int v){
flag[v] = 1;
cout<<v<<" ";
for (int i = 1; i <= n ; ++i) {//沿着该结点的边遍历图
if(g[v][i] && !flag[i]){
dfs(i);
}
}
}
void dfsTraverse(){
for (int i = 1; i <= n ; ++i) {
if(!flag[i]){//每个结点都需要跑dfs
dfs(i);
}
}
}
int main(){
cin>>n;
for (int i = 1; i <= n ; ++i) {//构造邻接矩阵存储图
for (int j = 1; j <= n ; ++j) {
cin>>g[i][j];
}
}
dfsTraverse();//dfs遍历图
}