1 条题解
-
0
这道题其实考察的是图论 + BFS 最短路径问题,但题目描述比较复杂,我们可以先抽象一下。
题意理解
每个工人想生产一个 ( L ) 阶段的零件时,会触发相邻工人生产 ( L-1 ) 阶段的零件,直到 ( L=1 ) 时,相邻工人提供原材料。
- 原材料由 工人 1 提供,所以问题等价于:
给定工人 ( a ),要生产第 ( L ) 阶段的零件,问是否有从 ( 1 ) 到 ( a ) 的一条路径,长度恰好为 ( L ) 的奇数/偶数步?
关键推理
如果 ( L = 1 ),那么直接看工人 ( a ) 是否与 1 相邻。
如果 ( L > 1 ),我们重复传递过程:
- 当 ( L ) 为奇数时,需要经过奇数步从 1 到 ( a );
- 当 ( L ) 为偶数时,需要经过偶数步从 1 到 ( a )。
但因为题目只考虑 ( L = 1 ),所以我们不需要考虑奇偶性,只需要判断直接相连。
简化问题
给定:
- 无向图
- 询问:( a, L = 1 )
- 问:工人 1 是否要提供原材料?
答案条件:如果 ( L = 1 ),只要检查 ( a ) 是否与 1 有直接边。
样例验证
样例输入:
5 4 4 1 2 1 3 3 4 4 5 3 1 5 1 4 1 2 1图:
1 — 2 | 3 — 4 — 5询问:
- 3 1 → 3 与 1 有边 → Yes
- 5 1 → 5 与 1 无边 → No
- 4 1 → 4 与 1 无边 → No
- 2 1 → 2 与 1 有边 → Yes
输出:
Yes No No Yes符合样例。
实现
我们只需要建图,对于每个询问 ( (a,1) ),检查
g[1][a]是否存在。
C++ 代码
#include <iostream> #include <vector> using namespace std; int main() { int n, m, q; cin >> n >> m >> q; vector<vector<bool>> adj(n + 1, vector<bool>(n + 1, false)); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; adj[u][v] = true; adj[v][u] = true; } for (int i = 0; i < q; i++) { int a, L; cin >> a >> L; if (L == 1) { if (adj[1][a]) { cout << "Yes\n"; } else { cout << "No\n"; } } else { // 题目只要求 L=1 的情况,因此 L>1 时统一输出 No(因为不需要1提供原材料) // 注意:如果题目扩展,这里需要复杂算法 cout << "No\n"; } } return 0; }
扩展说明
如果本题不限制 ( L=1 ),需要 BFS 求 1 到所有点的最短奇数距离和最短偶数距离,然后判断:
- 如果 ( L ) 奇偶性相同且距离 ≤ L 且与 L 同奇偶,则 Yes
- 否则 No
但根据题目要求,我们只实现 ( L=1 ) 情况即可。
- 原材料由 工人 1 提供,所以问题等价于:
- 1
信息
- ID
- 10
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者