链接:https://ac.nowcoder.com/acm/contest/2340/D
已替换官方数据
第一行两个正整数 ?,? 和 ?,分别表示工人的数目、传送带的数目和工单的数目。 接下来 ? 行,每行两个正整数 ? 和 ?,表示编号为 ? 和 ? 的工人之间存在一条零 件传输带。保证 ? ≠ ?。 接下来 ? 行,每行两个正整数 ? 和 ?,表示编号为 ? 的工人想生产一个第 ? 阶段 的零件。
共 ? 行,每行一个字符串 “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。
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.