题意:
你有n个人,给你其中m个亲戚关系,问你其中p个得关系是什么,是亲戚输出yes,不然输出no。
如果1和3是亲戚,2和3是亲戚,那么1和2也是亲戚
n,m,p<50000
思路:
并查集得经典例题,把他们是属于亲戚关系的放到一个集合里面,给一个父亲节点。然后找就只用找他们的父亲是否相同就好了。
时间复杂度
O(n*****),表示有点看不懂….反正很小就是了
const
maxn=50000;
var
f:array [1..maxn] of longint;
i,j,n,m,p,x,y:longint;
function getfather(v:longint):longint;
var
i,j:longint;
begin
if f[v]<>v then getfather:=getfather(f[v])
else getfather:=v;
f[v]:=getfather;
end;
function indge(x,y:longint):boolean;
var
fx,fy:longint;
begin
fx:=getfather(x);
fy:=getfather(y);
if fx=fy then indge:=true
else indge:=false;
end;
begin
readln(n,m,p);
for i:=1 to n do
f[i]:=i;
for i:=1 to m do
begin
readln(x,y);
f[getfather(y)]:=getfather(f[x]);
end;
for i:=1 to p do
begin
readln(x,y);
if indge(x,y) then writeln('Yes')
else writeln('No');
end;
end.