Description
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
Input
第一行:三个整数n,m,p,(n<=50000,m<=50000,p<=50000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有亲戚关系。接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。
Output
P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。
Sample Input
6 5 3
41 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
Sample Output
Yes
Yes
No
var
a:array[0..50001] of longint;
ans:array[0..50001] of boolean;
i,n,m,j,k,x,y,tot,max,sort1,sort2:longint;
procedure find(x,y:longint);
var
i:longint;
begin
if a[x]<>0 then find(a[x],y+1)
else begin
if tot=0 then tot:=y;
exit;
end;
end;
function root(x,y:longint):longint;
begin
if a[x]<>0 then root:=root(a[x],y);
if max=0 then
begin
if x=y then max:=y
else max:=x;
end;
exit;
end;
procedure union(x,y:longint);
var
u,v,i:longint;
begin
tot:=0;
find(x,1);
u:=tot;
tot:=0;
find(y,1);
v:=tot;
if u>v then begin
max:=0;
root(y,y);
a[max]:=x;
end
else begin
max:=0;
root(x,x);
a[max]:=y;
end;
end;
begin
readln(n,m,k);
fillchar(a,sizeof(a),0);
for i:=1 to m do
begin
readln(x,y);
max:=0;
root(x,x);
sort1:=max;
max:=0;
root(y,y);
sort2:=max;
if sort1=0 then union(x,y)
else if (sort1<>sort2) then union(x,y);
end;
for i:=1 to m do
if a[i]<>0 then
begin
max:=0;
root(i,i);
a[i]:=max;
end;
for i:=1 to k do
begin
readln(x,y);
max:=0;
root(x,x);
sort1:=max;
max:=0;
root(y,y);
sort2:=max;
if sort1<>sort2 then ans[i]:=false
else ans[i]:=true;
end;
for i:=1 to k do
if ans[i]=true then writeln('Yes')
else writeln('No');
end.