当前位置:   article > 正文

图的遍历——深度优先搜索_深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。其过程为:假设初始状

深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。其过程为:假设初始状

Description
深度优先搜索遍历类似于树的先根遍历,是树的先根遍历的推广。其过程为:假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可以从图中的某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。其算法可以描述如下:
在这里插入图片描述
在本题中,读入一个无向图的邻接矩阵(即数组表示),建立无向图并按照以上描述中的算法遍历所有顶点,输出遍历顶点的顺序。

Input
输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。
输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。
Output
只有一行,包含n个整数,表示按照题目描述中的深度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。
Sample Input
4
0 1 0 1
1 0 0 0
0 0 0 1
1 0 1 0
Sample Output
0 1 3 2

#include<stdio.h>
int p[60][60],distory[51];
int sum,n;
void dfs(int cur)
{
	sum++;
	printf("%d ",cur);
	int i;
	if(sum == n)
	{
		return;
	}
	for(i = 0;i < n; i++)
	{
		if(p[cur][i] == 1 &&distory[i] == 0)
		{
			distory[i] = 1;
			dfs(i);
		}
	}
	return;
}
int main()
{
	int i,j,k;
	scanf("%d",&n);
	for(i = 0;i < n;i ++)
		for(j = 0;j < n;j ++)
		{
			scanf("%d",&k);
			p[i][j]=k;
		}
	distory[0]=1;
	dfs(0);	
    return 0;
 } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/509690
推荐阅读
相关标签
  

闽ICP备14008679号