本人初次写题解,还请各位大佬多多指教)(本题解目前只适用于牛客数据(毕竟真实数据还没出))
接下来进入正题:
1.题意:自己读题去吧(皮一下就很棒)
2.思路:我们可以把题目转化成一张图图片说明(第一个样例)问题要求寻找需要第一个点提供原材料的情况。也就是说,要求第一个点到当前点的距离为L。不难发现,一旦两个点直接或间接连通,两个点间的距离可以无限的+2增长(不断来回) 。因此,对于每个点,我们可以求出最短路径,然后判断:
(L-1~a的最短路径)mod 2。如果为0,那么就可以达到L的距离。(你以为这样就OK啦?NO!)然后我们会发现,这个思路连样例都过不去,这是为什么呢?
图片说明 我们可以看到,1~2的最短距离为1,如果用我们上面的规律就会发现:当a=2,L=6时,应该输出No,但我们手推一下就可以发现,当按照1-5-4-3-2-3-2的顺序传递时,应该输出Yes,所以我们要求出距离为奇数的最短距离和距离为偶数的最短距离。
下面贴上代码(并提供注释解释)

type
 FPX=record    //这个记录的名字就无需在意(小小的皮一下)
  x,y,t:longint;   //x是当前的点,y是奇偶判断,t是距离
 end;
var
 a:array[1..100000,0..200]of longint;   //数组模拟邻接表
 i,j,k,l,m,n,s,t,x,y,z,o:longint;
 b:array[1..100000,0..1]of longint;
 c:Array[1..100000,0..1]of boolean;
 d:array[1..2000000]of FPX;
procedure down;     //堆,向下调整
var
 i,j:longint;
 t:FPX;
begin
 i:=1;
 while i*2<=z do
  begin
   if d[i].t>d[i*2].t then j:=i*2
                  else j:=i;
   if(i*2+1<=z)and(d[j].t>d[i*2+1].t)then j:=i*2+1;
   if i=j then break
          else begin
                t:=d[i];
                d[i]:=d[j];
                d[j]:=t;
                i:=j;
               end;
  end;
end;
procedure up;       //堆,向上调整
var
 i:longint;
 t:FPX;
begin
 i:=z;
 while i>1 do
  begin
   if d[i div 2].t>d[i].t then begin
                            t:=d[i div 2];
                            d[i div 2]:=d[i];
                            d[i]:=t;
                           end
                      else break;
   i:=i div 2;
  end;
end;
begin
 readln(n,m,l);
 for i:=1 to m do    //建立邻接表
  begin
   readln(x,y);
   inc(a[x,0]);
   a[x,a[x,0]]:=y;
   inc(a[y,0]);
   a[y,a[y,0]]:=x;
  end;
 fillchar(b,sizeof(b),$7f);
 b[1,0]:=0; z:=1;
 d[z].t:=0; d[z].x:=1;
 while true do         //堆优化的Dij
  begin
   if z=0 then break;
   t:=d[1].t; x:=d[1].x;
   y:=d[1].y; d[1]:=d[z];
   dec(z); down;
   if c[x,y] then continue;
   c[x,y]:=true;
   for j:=1 to a[x,0] do
    begin
     o:=a[x,j];
     k:=(y+1)mod 2;
     if b[o,k]>t+1 then begin
                         b[o,k]:=t+1;
                         inc(z);
                         d[z].t:=t+1;
                         d[z].x:=o;
                         d[z].y:=k;
                         up;
                        end;
    end;
  end;
 for i:=1 to l do
  begin
   readln(x,y);
   t:=y mod 2;
   if y>=b[x,t] then writeln('Yes')
                else writeln('No');
  end;
end.