题干分析
- 这道题看上去很难
确实很难 ,但是有一点很重要,就是相邻两个工人可以不停要求对方提供零件,直到原材料,两个工人,可以理解为不停减2,奇偶性不变。 - 然后就要考虑用各种方法求最短路了
具体思路
- 路径太多要用动态数组,我用的是广搜,广搜中的队列是STL,求路径要分奇偶。
- ps. 求路径有多种方法(比如dijistra),顶礼膜拜会多种方法的大神们
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,q,u,v;
struct Node{
int odd,even;
}dis[100001];
vector<int>a[100001];
queue<int>f;
inline void jqsh(){
memset(dis,126,sizeof(dis));
dis[1].odd=0;
f.push(1);
while(f.size()){
int t=f.front();
f.pop();
for(int i=0;i<a[t].size();i++){
int k=a[t][i];
int xl=dis[k].odd,yl=dis[k].even;
dis[k].odd=min(dis[t].even+1,dis[k].odd);
dis[k].even=min(dis[t].odd+1,dis[k].even);
if(dis[k].odd!=xl||dis[k].even!=yl) f.push(k);
}
}
return;
}
int main(){
scanf("%d %d %d",&n,&m,&q);
for(int i=1;i<=m;i++){
scanf("%d %d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
jqsh();
while(q--){
int x,y,z=0;
scanf("%d %d",&x,&y);
if(y%2&&dis[x].even<=y) printf("Yes\n");
else if(y%2==0&&dis[x].odd<=y) printf("Yes\n");
else printf("No\n");
}
return 0;
}