输入
输入的第一行包含一个正整数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号顶点。
此题用的广度优先搜索,主要思想是:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问他们相邻的未被访问过的顶点,直到所有的顶点都被访问过,遍历结束。