#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=1e5+10;
int Begin[N],Next[2*N],To[2*N],ji[N],ou[N];
int n,m,q,u,v,e;
queue<pair<int,int>>que;
pair<int,int>now;
void add(int x,int y){
To[++e]=y;
Next[e]=Begin[x];
Begin[x]=e;
}
void bfs(){
memset(ji,0x3f,sizeof ji);
memset(ou,0x3f,sizeof ou);
for(int i=Begin[1];i;i=Next[i]){
ji[To[i]]=1;
que.push(make_pair(To[i],1));
}
while(!que.empty()){
now=que.front();
que.pop();
for(int i=Begin[now.first];i;i=Next[i]){
if(now.second%2==1){
if(now.second+1<ou[To[i]]){
ou[To[i]]=now.second+1;
que.push(make_pair(i,ou[To[i]]));
}
}
else if(now.second+1<ji[To[i]]){
ji[To[i]]=now.second+1;
que.push(make_pair(i,ji[To[i]]));
}
}
}
return ;
}
int main(){
scanf("%d %d %d",&n,&m,&q);
for(int i=1;i<=m;++i){
scanf("%d %d",&u,&v);
add(u,v);
add(v,u);
}
bfs();
while(q--){
scanf("%d %d",&u,&v);
if(v%2==0){
if(ou[u]>v)puts("NO");
else puts("YES");
}
else{
if(ji[u]>v)puts("NO");
else puts("YES");
}
}
return 0;
}
第一篇题解的思路用链式前向星存图。