本题非常明显是图论的最短路问题,但是不能简单的求1号工人与其他工人的最短路,因为该图为无向连通图,不排除两个工人之间互相传递。
想到这里,发现了吗?其实加工零件阶段的奇偶与两人之间最短路的奇偶有必然关系:若阶段为奇数,那么最短路是偶数时,两个无法比较;若阶段为偶数,那么最短路是奇数时,两个无法比较。
处理方法就是:分别记录一号工人与其他工人之间的奇数最短路与偶数最短路,当输入的是奇数时,就与奇数最短路比较;当输入的是偶数时,就与偶数最短路比较。
那么我们只需要稍微改变一下SPFA算法,就可以实现该预处理,然后就可以一次扫描得出结果。
不多说,上代码。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
/*扫描每个点的相连节点,求出它们之间的最短路径,若路径长度大于阶段数,则No,否则Yes*/
const int N=2e5+10;
int n,m,q;
struct node{
int next,to;
}pix[2*N];
int h[N],cnt=0;
void add(int u,int v)
{
cnt++;
pix[cnt].n