XDOJ659题题解:旅行问题bfs

这一题说明明确给出了使用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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值