#include <iostream>
#include <algorithm>
using namespace std ;
const int INF = 0x3f3f3f3f ;
const int MAX =100 ;
int n , m ;
int book[MAX]; // 用于标记 是否访问过book[i] i 顶点
int que[MAX] ; // 队列
int map[MAX][MAX] ; // 用一个二维数组来存储图
void init()
{
// 邻接矩阵存储图;
int i ,j ;
for(i=1 ;i<=n;i++)
{
for(j = 1 ; j<=n ;j++)
{
if(i==j)
map[i][j] = 0 ;
else
map[i][j] = INF ;
}
}
int a ,b ;
for(i=1; i<=m;i++)
{
// 写入邻边
cin>>a>>b ;
map[a][b] = 1 ;
map[b][a] = 1 ;
}
return ;
}
int main()
{
int head = 1 ; // 对头
int tail = 1 ; // 队尾
int i ;
cin>>n >>m ;
init();
que[tail] = 1; // 先把 1 这个顶点放入到队列中去 ;
tail++;
book[1] = 1; // 标记第一个顶点已经访问过了
while(head<tail &&tail<=n)
{
int cur = que[head];// 每次都把对列的头赋给cur 作为当前顶点
// 对 1 ~ n 依次遍历;
for(i=1;i<=n ;i++)
{
if(map[cur][i]==1 && book[i]==0)
// 如果cur节点 可以到达 i 节点 并且还没有访问过i
{
// 把它加入到队列中来
que[tail] = i ;
tail++ ;
book[i] = 1 ; // 标记
}
}
if(tail>n)
{
break;
}
head++; // 一定不要忘记
}
for(i=1;i<=n;i++)
{
cout<<que[i]<<" ";
}
return 0;
}
广度优先搜素的主要思想就是: 首先要以一个未被访问的顶点作为起始顶点,访问其相邻的顶点,然后对每一个相邻的顶点,再去访问他们相邻的未被访问的顶点,直到所有的顶点都被访问过;
que
head tail
1 | 2 | 3 | 5 | 4 | 0 |