【并查集】家族
题目:家族 rqnoj331
题目描述
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
输入格式
第一行:三个整数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个询问的答案为“具有”或“不具有”亲戚关系。
样例输入
样例输出
并查集之入门题目,完全是标准代码,不解释
Pascal Code
program relation; var n,m,p:longint; f:array[0..5000+10] of longint; procedure init; begin assign(input,'rqnoj331.in'); assign(output,'rqnoj331.out'); reset(input); rewrite(output); end; procedure outit; begin close(input); close(output); halt; end; procedure predoing; var i:longint; begin for i:=1 to n do f[i]:=i; end; function find(x:longint):longint; begin if f[x]=x then exit(x); f[x]:=find(f[x]); exit(f[x]); end; procedure insert(x,y:longint); var rx,ry:longint; begin rx:=find(x); ry:=find(y); f[rx]:=ry; end; procedure readdata; var i,x,y:longint; begin read(n,m,p); predoing; for i:=1 to m do begin read(x,y); insert(x,y); end; for i:=1 to p do begin read(x,y); if find(x)=find(y) then writeln('Yes') else writeln('No'); end; end; procedure main; begin end; begin init; readdata; main; outit; end.
..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh