深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。其过程为:假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可以从图中的某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。
其算法可以描述如下:
在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有顶点,输出遍历顶点的顺序。
输入
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
只有一行,包含n个整数,表示按照题目描述中的深度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。
1 #include<stdio.h>
2 const int maxn=100;
3 bool visted[maxn];
4 int G[maxn][maxn]={0};//注意这里的数组定义在最前面是最好的,可以在任意函数模块直接使用
5 void DFS(int v,int n){//因为二维数组作为函数参数传递会比较麻烦
6 printf("%d ",v);
7 int w;
8 visted[v]=true;
9 for(w=0;w<n;w++){
10 if(G[v][w]==1 && visted[w]==false){//访问目前节点的相邻节点,如果节点存在边并且没有被访问,那么递归DFS
11 DFS(w,n);
12 }
13 }
14 }
15 void DFSTraverse(int n){
16 for(int i=0;i<n;i++){
17 visted[i]=false;
18 }
19 int k;
20 for(k=0;k<n;k++){//遍历每个顶点,如果没有被访问,那么就可以DFS
21 if(!visted[k]){
22 DFS(k,n);
23 }
24 }
25 }
26 int main(){
27 int n;
28 scanf("%d",&n);
29 for(int i=0;i<n;i++){
30 for(int j=0;j<n;j++){
31 scanf("%d",&G[i][j]);
32 }
33 }
34 DFSTraverse(n);
35 return 0;
36 }