图的遍历-广度优先搜索

输入

输入的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。

以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个0或1,1表示第i个顶点和第j个顶点有直接连接,0表示没有直接连接。当i和j相等的时候,保证对应的整数为0。

输入保证邻接矩阵为对称矩阵,即输入的图一定是无向图。

输出

只有一行,包含n个整数,表示按照题目描述中的广度优先遍历算法遍历整个图的访问顶点顺序。每个整数后输出一个空格,并请注意行尾输出换行。

样例输入

4
0 0 0 1
0 0 1 1
0 1 0 1
1 1 1 0

样例输出

0 3 1 2 

提示

在本题中,需要熟练掌握图的邻接矩阵存储方式。在建立完成无向图之后,需要严格按照题目描述的遍历顺序对图进行遍历。另外,算法中描述的FirstAdjVex函数和NextAdjVex函数,需要认真的自行探索并完成。在本题中需要使用队列结构,需要对队列的概念进行复习。

通过这道题目,应该能够对图的广度优先搜索建立更加直观和清晰的概念。

代码:

#include <stdio.h>
#include <string.h>

int main()
{
	int i,j,m,cur;
	int book[60],que[60],e[60][60];
	int head,tail;
	memset(e,0,sizeof(e));
	scanf("%d",&m);
	for(i=0;i<m;i++)
		for(j=0;j<m;j++)
			scanf("%d",&e[i][j]);
	memset(book,0,sizeof(book));
	memset(que,0,sizeof(que));
	head=0;
	tail=0;
	que[tail]=0;
	tail++;
	book[0]=1;
	while(head<tail&&tail<m)
	{
		cur=que[head];
		for(i=0;i<m;i++)
		{
			if(e[cur][i]==1&&book[i]==0)
			{
				que[tail]=i;
				tail++;
				book[i]=1;
			}
			if(tail>m)
			{
				break;
			}
		}
		head++;
		
	}
	for(i=0;i<tail;i++)
			printf("%d ",que[i]);
		printf("\n");
	return 0;
}

注:所谓无向图就是图的边没有方向,例如1号顶点能到2号顶点,2号顶点也可以到1号顶点。

此题用的广度优先搜索,主要思想是:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问他们相邻的未被访问过的顶点,直到所有的顶点都被访问过,遍历结束。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值