题目背景 Background
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
题目描述 Description
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
输入输出格式 Input/output
输入格式:
第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。
以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有亲戚关系。
接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。
输出格式:
P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。
输入输出样例 Sample input/output
样例测试点#1
输入样例:
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
输出样例:
Yes
Yes
No
代码:
var n,m,p,i,x,y:longint;
f:array[1..5000] of longint;
function find(x:longint):longint; //查找父亲并路径压缩
begin
if f[x]=x then exit(x)
else find:=find(f[x]);
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); //读入一组数,并找他们的父亲
x:=find(x);
y:=find(y);
if x<>y then f[x]:=y; //如何父亲不同则合并
end;
for i:=1 to p do
begin
readln(x,y);
x:=find(x);
y:=find(y);
if x=y then writeln(‘Yes‘)
else writeln(‘No‘);
end;
end.