链接:https://ac.nowcoder.com/acm/contest/2340/D
来源:牛客网
 

已替换官方数据

        凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很 神奇。工厂里有 𝑛 位工人,工人们从 1∼𝑛1 \sim 𝑛1∼n 编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。
        如果 𝑥 号工人想生产一个被加工到第 𝐿(𝐿>1)𝐿(𝐿 \gt 1)L(L>1) 阶段的零件,则所有与 𝑥 号工人 有传送带直接相连的工人,都需要生产一个被加工到第 𝐿 −1 阶段的零件(但 𝑥 号工 人自己无需生产第 𝐿 −1 阶段的零件)。
        如果 𝑥 号工人想生产一个被加工到第 1 阶段的零件,则所有与 𝑥 号工人有传送 带直接相连的工人,都需要为 𝑥 号工人提供一个原材料。
        轩轩是 1 号工人。现在给出 𝑞 张工单,第 𝑖 张工单表示编号为 𝑎𝑖𝑎_𝑖ai​ 的工人想生产 一个第 𝐿𝑖𝐿_𝑖Li​阶段的零件。轩轩想知道对于每张工单,他是否需要给别人提供原材料。他 知道聪明的你一定可以帮他计算出来!

输入描述:

第一行两个正整数 𝑛,𝑚 和 𝑞,分别表示工人的数目、传送带的数目和工单的数目。
接下来 𝑚 行,每行两个正整数 𝑢 和 𝑣,表示编号为 𝑢 和 𝑣 的工人之间存在一条零 件传输带。保证 𝑢 ≠ 𝑣。
接下来 𝑞 行,每行两个正整数 𝑎 和 𝐿,表示编号为 𝑎 的工人想生产一个第 𝐿 阶段 的零件。

输出描述:

共 𝑞 行,每行一个字符串 “Yes” 或者 “No”。如果按照第 𝑖 张工单生产,需要编号为 1 的轩轩提供原材料,则在第 𝑖 行输出 “Yes”;否则在第 𝑖 行输出 “No”。注意输出不含引号。

示例1

输入

复制

3 2 6 
1 2 
2 3 
1 1 
2 1 
3 1 
1 2 
2 2 
3 2

输出

复制

No 
Yes 
No 
Yes 
No 
Yes

说明


 

编号为 1 的工人想生产第 1 阶段的零件,需要编号为 2 的工人提供原材料。 

编号为 2 的工人想生产第 1 阶段的零件,需要编号为 1 和 3 的工人提供原材料。 

编号为 3 的工人想生产第 1 阶段的零件,需要编号为 2 的工人提供原材料。 

编号为 1 的工人想生产第 2 阶段的零件,需要编号为 2 的工人生产第 1 阶段的零件,需要编号为 1 和 3 的工人提供原材料。 

编号为 2 的工人想生产第 2 阶段的零件,需要编号为 1 和 3 的工人生产第 1 阶段 的零件,他/她们都需要编号为 2 的工人提供原材料。 

编号为 3 的工人想生产第 2 阶段的零件,需要编号为 2 的工人生产第 1 阶段的零 件,需要编号为 1 和 3 的工人提供原材料。 
 
 

示例2

输入

复制

5 5 5 
1 2 
2 3 
3 4 
4 5 
1 5 
1 1 
1 2 
1 3 
1 4 
1 5

输出

复制

No 
Yes 
No 
Yes 
Yes

说明


 

编号为 1 的工人想生产第 1 阶段的零件,需要编号为 2 和 5 的工人提供原材料。 

编号为 1 的工人想生产第 2 阶段的零件,需要编号为 2 和 5 的工人生产第 1 阶段 的零件,需要编号为 1,3,4 的工人提供原材料。 

编号为 1 的工人想生产第 3 阶段的零件,需要编号为 2 和 5 的工人生产第 2 阶段的零件,需要编号为 1,3,4 的工人生产第 1 阶段的零件,需要编号为 2,3,4,5 的工人提供原材料。 

编号为 1 的工人想生产第 4 阶段的零件,需要编号为 2 和 5 的工人生产第 3 阶段 的零件,需要编号为 1,3,4 的工人生产第 2 阶段的零件,需要编号为 2,3,4,5 的工人生产 第 1 阶段的零件,需要全部工人提供原材料。 

编号为 1 的工人想生产第 5 阶段的零件,需要编号为 2 和 5 的工人生产第 4 阶段 的零件,需要编号为 1,3,4 的工人生产第 3 阶段的零件,需要编号为 2,3,4,5 的工人生产第 2 阶段的零件,需要全部工人生产第 1 阶段的零件,需要全部工人提供原材料。 

备注:

共 20 个测试点。 
1≤𝑢,𝑣,𝑎≤𝑛1 \leq 𝑢,𝑣,𝑎 \leq 𝑛1≤u,v,a≤n。 
测试点 1∼41\sim 41∼4,1≤𝑛,𝑚≤10001 \leq 𝑛,𝑚 \leq 10001≤n,m≤1000,𝑞 = 3,𝐿 = 1。 
测试点 5∼85\sim 85∼8,1≤𝑛,𝑚≤10001 \leq 𝑛,𝑚 \leq 10001≤n,m≤1000,𝑞 = 3,1≤𝐿≤101 \leq 𝐿 \leq 101≤L≤10。 
测试点 9∼129\sim 129∼12,1≤𝑛,𝑚,𝐿≤10001 \leq 𝑛,𝑚,𝐿 \leq 10001≤n,m,L≤1000,1≤𝑞≤1001 \leq 𝑞 \leq 1001≤q≤100。 
测试点 13∼1613\sim 1613∼16,1≤𝑛,𝑚,𝐿≤10001 \leq 𝑛,𝑚,𝐿 \leq 10001≤n,m,L≤1000,1≤𝑞≤1051 \leq 𝑞 \leq 10^51≤q≤105。 
测试点 17∼2017\sim 2017∼20,1≤𝑛,𝑚,𝑞≤1051 \leq 𝑛,𝑚,𝑞 \leq 1051≤n,m,q≤105,1≤𝐿≤1091 \leq 𝐿 \leq 10^91≤L≤109。

求奇数最短路径和偶数最短路径,查零件L是否差奇数或偶数个路径~官方的答案,我还没做出来

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.