这一题说明明确给出了使用BFS的要求,所以自然的联想到队列的使用
我们可以使用队列去储存每个节点接下来访问到的节点,代码如下:
#define _CRT_SECURE_NO_WARNINGS//非vs编译器可以去掉这一行
#include<iostream>
using namespace std;
#include<queue>
queue <int> s;
int n = 0;
int m = 0;
int arr[110][110] = { 0 };//创建一个二维数组来存储地图上各个城市相互连接的信息
bool state[110] = { false };//记录每个城市是否被访问过,避免重复
int map[1010] = { 0 };//记录访问的各个城市,用于后续输出
int cnt = 0;//计数
void bfs(int x)
{
state[1] = true;//访问1城市
s.push(x);//将1城市加入队列
map[cnt++] = s.front();//记录城市1
while (!s.empty())//队列空了说明无法到达城市n,无需继续循环
{
for (int i = 1; i <= n; i++)//依次访问城市
{
if (arr[x][i] == 1&&state[i]==false)//访问可以到达并且没有访问过的城市
{
state[i] = true;//更改城市状态为已经访问过
if (i == n)
{
cout << "YES" << endl;//判断是否已经到了城市n
map[cnt++] = n;
return;
}
map[cnt++] = i;//记录当前访问的城市
s.push(i);
}
}
s.pop();
x = s.front();
}
cout << "NO" << endl;
}
int main()
{
cin >> n;
cin >> m;
int x = 0;
int y = 0;
for (int i = 0; i < m; i++)
{
cin >> x >> y;
arr[x][y] = 1;//存储地图节点连接信息,如果x,y可以相互到达arr[x][y]记为1
arr[y][x] = 1;
}
bfs(1);//开始bfs,将初始节点传给函数
for (int i = 0; i < cnt; i++)
{
cout << map[i] << ' ';//输出访问的各个城市
}
return 0;
}