广度优先搜索:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点,直到所有顶点都被访问过。
在邻接矩阵中的存储:
代码实现:
#include "stdio.h"
int main()
{
int i,j,m,n,a,b,cur,book[101] = {0},e[101][101];
int que[10001],head,tail;
scanf("%d %d",&n,&m);
//初始化二维矩阵
for(i = 1; i <= n; i++)
for(j = 1;j <= n; j++)
if(i == j) e[i][j] = 0;
else e[i][j] = 99999999; //假设为正无穷
//读入顶点之间的边
for(i = 1; i<=m; i++)
{
scanf("%d %d",&a,&b);
e[a][b] = 1;
e[b][a] = 1; //无向图
}
//队列初始化
head = 1;
tail = 1;
//从1号顶点出发,将1号顶点加入队列
que[tail] = 1;
tail++;
book[1] = 1; //标记已被访问
//当队列不为空
while(head < tail && tail <= n)
{
cur = que[head]; //当前正在访问的顶点编号
for(i = 1; i <= n; i++) //依次访问每一个顶点
{
if(e[cur][i] == 1 && book[i] == 0)
{
//从第一个出发并将其入队
que[tail] = i;
tail ++;
book[i] = 1;//标记顶点i已被访问
}
//如果tail大于n,则表明所有顶点都已经被访问
if(tail > n)
{
break;
}
}
head++; //下一个
}
for(i=1;i<tail;i++)
printf("%d ",que[i]);
getchar();
getchar();
return 0;
}
效果图: