2019 加工零件 · 方案二 奇偶最短路
状态加一维奇偶,一次 BFS 回答所有工单
正文
// CSP-J 2019 复赛 T4 · 加工零件(方案二 · 满分)
// 原题:https://oj.yecheng.tv/p/CSPJ2019D
//
// 方案二 · 奇偶最短路 BFS
// 换一种问法:1 号要提供原材料,等价于
// 「从 a 出发,存在一条长度恰好为 L 的走法(点和边都允许重复走)到达 1 号」。
// 而只要存在一条长度为 d 的走法,且 d 与 L 奇偶相同、d <= L,
// 就可以在任意一条边上「走过去再走回来」补 2 步,一路凑到 L 步。
// 所以只要求出 1 号到每个点的「最短奇数步数」和「最短偶数步数」就够了。
// 做法:状态写成 (点, 当前步长的奇偶),每走一条边奇偶翻转,跑一次 BFS。
// 复杂度:时间 O(n + m + q),空间 O(n)。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int INF = 0x3f3f3f3f;
vector<int> g[MAXN];
int dis[MAXN][2]; // dis[v][0]:1 号到 v 的最短偶数步;dis[v][1]:最短奇数步
int main() {
freopen("work.in", "r", stdin);
freopen("work.out", "w", stdout);
int n, m, q;
cin >> n >> m >> q;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
memset(dis, 0x3f, sizeof(dis));
queue<pair<int, int>> que;
dis[1][0] = 0;
que.push(make_pair(1, 0));
while (!que.empty()) {
int v = que.front().first;
int p = que.front().second;
que.pop();
for (int w : g[v]) {
int np = p ^ 1; // 走一条边,步长奇偶翻转
if (dis[w][np] != INF) continue;
dis[w][np] = dis[v][p] + 1;
que.push(make_pair(w, np));
}
}
while (q--) {
int a, L;
cin >> a >> L;
int best = dis[a][L % 2]; // 只关心与 L 同奇偶的那一条
if (best <= L) cout << "Yes\n";
else cout << "No\n";
}
return 0;
}
CSP-J 标程 · 复赛真题的其它内容
- 2019 数字游戏 · 方案一 逐字符统计
- 2019 数字游戏 · 方案二 二进制位运算
- 2020 优秀的拆分 · 方案一 贪心从大到小减
- 2020 优秀的拆分 · 方案二 直接看二进制位
- 2021 分糖果 · 方案一 枚举每个 k
- 2021 分糖果 · 方案二 看余数在哪一段
- 2022 乘方 · 方案一 边乘边判断
- 2022 乘方 · 方案二 快速幂加封顶
- 2023 小苹果 · 方案一 照规则真模拟
- 2023 小苹果 · 方案二 只盯住两个数字
- 2024 扑克牌 · 方案一 用集合去重
- 2024 扑克牌 · 方案二 二维布尔表
- 2025 拼数 · 方案一 收集后降序排序
- 2025 拼数 · 方案二 桶计数
- 2019 公交换乘 · 方案一 暴力匹配
- 2019 公交换乘 · 方案二 时间窗口优化
- 2020 直播获奖 · 方案一 每轮排序
- 2020 直播获奖 · 方案二 桶计数
- 2021 插入排序 · 方案一 每次真排一遍
- 2021 插入排序 · 方案二 增量维护有序表
- 2022 解密 · 方案一 二分求整数平方根
- 2022 解密 · 方案二 先估后校开方
- 2023 公路 · 方案一 朴素贪心
- 2023 公路 · 方案二 单调栈预处理
- 2024 地图探险 · 方案一 四方向分支写
- 2024 地图探险 · 方案二 方向数组
- 2025 座位 · 方案一 把座位表填出来
- 2025 座位 · 方案二 直接算排名
- 2019 纪念品 · 方案一 逐天完全背包
- 2019 纪念品 · 方案二 砍掉不赚钱物品
- 2020 表达式 · 方案一 每次重算后缀式
- 2020 表达式 · 方案二 建树加关键性传播
- 2021 网络连接 · 方案一 手写解析
- 2021 网络连接 · 方案二 读入后回拼校验
- 2022 逻辑表达式 · 方案一 递归分治
- 2022 逻辑表达式 · 方案二 递归下降
- 2023 一元二次方程 · 方案一 照公式逐步写
- 2023 一元二次方程 · 方案二 拆成小函数
- 2024 小木棍 · 方案一 先定位数再贪心
- 2024 小木棍 · 方案二 预处理最小数字表
- 2025 异或和 · 方案一 贪心能接就接
- 2025 异或和 · 方案二 动态规划加值域数组
- 2019 加工零件 · 方案一 递归加记忆化
- 2020 方格取数 · 方案一 深搜回溯
- 2020 方格取数 · 方案二 按列动态规划
- 2021 小熊的果篮 · 方案一 每轮扫一遍
- 2021 小熊的果篮 · 方案二 链表加有序集合
- 2022 上升点列 · 方案一 先只考虑不加点
- 2022 上升点列 · 方案二 二维动态规划
- 2023 旅游巴士 · 方案一 分层图加优先队列
- 2023 旅游巴士 · 方案二 状态压成一维
- 2024 接龙 · 方案一 按定义广搜
- 2024 接龙 · 方案二 滑动窗口逐轮推进
- 2025 多边形 · 方案一 枚举所有子集
- 2025 多边形 · 方案二 排序加计数 DP