题目连接 该题是CSP-J2-2019-T4 题目大意 给出一张无向图; 点表示工人,任意一个工人如果要做 x 阶段 的物品,相邻的工人需要提供 x-1 阶 的物品; 0阶 的物品设定为原材料 多组询问,若 a 号工人做 L 阶物品的时候,1 号工人是否需要提供原材料(0阶物品)。 题目分析 第一感觉像是树的分层,如下图:2号点如果要做1阶的物品,则相邻的都给他提供原材料(0阶物品) 再想,如下图:如果 2号点 要做2阶的物品, 相邻的工人 需要给他提供1阶的物品, 次相邻的工人 则需要提供0阶(原材料)的物品。 如果没有次外层的援助,像 3号点 和 4号点 的原材料从哪里来呢?答案是: 2号点 提供(其实,根据题意,2号点也同时给1号点和5号点提供原材料) 所以,应该是和间隔有关,奇偶性? 让我想到了某题类似“虫洞” 解题思路 跟奇偶性有关,那就尝试拆点吧,将所有点都拆成 奇点 和 偶点 ; d[x][0] 表示:x点提供偶数阶(包括原材料:0阶)的材料; d[x][1] 表示:x点提供奇数阶的材料; x <=> y 的边就变成了奇偶交叉相连的两条边了; 跑一遍最短路,知道所有点之间的奇偶到达情况。 接下来询问就是O(1)出答案了吧。 参考代码 //CSP-J2-4-加工零件 //奇偶拆点+最短路问题 #include<bits/stdc++.h> const int N=1e5+5; using namespace std; int n,m,qq,len; int las[N],d[N][2],v[N]; struct nod{