【题解-洛谷】B4292 [蓝桥杯青少年组省赛 2022] 路线

题目:B4292 [蓝桥杯青少年组省赛 2022] 路线

题目描述

有一个旅游景区,景区中有 N N N 个景点,景点以数字 1 1 1 到 N N N 编号,其中编号为 N N N 的景点为游客服务中心所在地。景区中有 M M M 条连接路线,每条路线连接两个景点。

已知:

  1. 一个景点可以被多条路线连接;
  2. 景点之间的连接路线都可以双向行走;

当给出 N N N 个景点和 M M M 条连接路线,及 M M M 条路线的连接关系,请你计算出从编号 1 1 1 到编号 N − 1 N-1 N−1 的每一个景点,到达游客服务中心至少需要经过几条路线。如果某个景点不能到达游客服务中心则输出 − 1 -1 −1。

例如:

  • 当 N = 5 N=5 N=5, M = 4 M=4 M=4 时
  • 4 条路线的连接关系为: 1 ↔ 2 1\leftrightarrow2 1↔2、 1 ↔ 3 1\leftrightarrow3 1↔3、 2 ↔ 4 2\leftrightarrow4 2↔4、 2 ↔ 5 2\leftrightarrow5 2↔5
  • 则:
    • 景点 1 1 1 到达景点 5 5 5(游客服务中心)至少经过 2 2 2 条路线(路线 2 2 2,路线 4 4 4)
    • 景点 2 2 2 到达景点 5 5 5 至少经过 1 1 1 条路线(路线 4 4 4)
    • 景点 3 3 3 到达景点 5 5 5 至少经过 3 3 3 条路线(路线 1 1 1,路线 2 2 2,路线 4 4 4)
    • 景点 4 4 4 到达景点 5 5 5 至少经过 2 2 2 条路线(路线 3 3 3,路线 4 4 4)

输入格式

第一行输入两个正整数 N N N 和 M M M( 4 ≤ N ≤ 100 4 \leq N \leq 100 4≤N≤100, 1 ≤ M ≤ 100 1 \leq M \leq 100 1≤M≤100), N N N 表示景点个数, M M M 表示路线条数,两个正整数之间一个空格隔开。

接下来输入 M M M 行,每行包括两个正整数 S S S, E E E( 1 ≤ S ≤ N 1 \leq S \leq N 1≤S≤N, 1 ≤ E ≤ N 1 \leq E \leq N 1≤E≤N, S ≠ E S \neq E S=E),两个正整数之间一个空格隔开,表示编号 S S S 和编号 E E E 的两个景点有一条路线连接。

输出格式

一行输出多个整数。按照 1 1 1 到 N − 1 N-1 N−1 的编号顺序,分别输出每个景点到达编号 N N N(游客服务中心),经过几条路线可以到达,如果某个景点不能到达则输出 − 1 -1 −1,整数之间一个空格隔开。

输入输出样例 #1

输入 #1

复制代码
5 4
1 2
1 3
2 4
2 5

输出 #1

复制代码
2 1 3 2

代码

cpp 复制代码
#include<iostream>
#include<cstring>

using namespace std;

const int MaxN = 100 + 10, MaxM = 100 + 10;
int N, M, h[MaxN], e[MaxM * 2], ne[MaxM * 2], idx, q[MaxN], hh, tt = -1, d[MaxN];

void init(){
    memset(h, -1, sizeof h);
}

void add(int a, int b){
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}

void init_queue(){
    hh = 0, tt = -1;
}

void insert(int x){
    q[++ tt] = x;
}

void dele(){
    hh ++;
}

bool isempty(){
    return hh > tt;
}

void bfs(){
    memset(d, -1, sizeof d);
    insert(N);
    d[N] = 0;

    while(!isempty()){
        int t = q[hh];
        dele();

        for(int i = h[t]; i != -1; i = ne[i]){
            int j = e[i];
            if(d[j] == -1){
                insert(j);
                d[j] = d[t] + 1;
            }
        }
    }
}
int main(){
    cin >> N >> M;
    init();
    while(M --){
        int a, b;
        cin >> a >> b;
        add(a, b), add(b, a);
    }
    bfs();
    for(int i = 1; i < N; i ++){
        cout << d[i] << " ";
    }
    return 0;
}

结果


相关推荐
颜酱4 分钟前
二叉树遍历思维实战
javascript·后端·算法
宝贝儿好6 分钟前
第二章: 图像处理基本操作
算法
小陈phd17 分钟前
多模态大模型学习笔记(二)——机器学习十大经典算法:一张表看懂分类 / 回归 / 聚类 / 降维
学习·算法·机器学习
@––––––18 分钟前
力扣hot100—系列4-贪心算法
算法·leetcode·贪心算法
CoovallyAIHub25 分钟前
让本地知识引导AI追踪社区变迁,让AI真正理解社会现象
深度学习·算法·计算机视觉
CoderCodingNo29 分钟前
【GESP】C++ 二级真题解析,[2025年12月]第一题环保能量球
开发语言·c++·算法
yumgpkpm30 分钟前
预测:2026年大数据软件+AI大模型的发展趋势
大数据·人工智能·算法·zookeeper·kafka·开源·cloudera
CoovallyAIHub44 分钟前
AAAI 2026这篇杰出论文说了什么?用LLM给CLIP换了个“聪明大脑”
深度学习·算法·计算机视觉
Physicist in Geophy.1 小时前
一维波动方程(从变分法角度)
线性代数·算法·机器学习
im_AMBER1 小时前
Leetcode 115 分割链表 | 随机链表的复制
数据结构·学习·算法·leetcode