关闭

问题 B: 亲戚

116人阅读 评论(0) 收藏 举报
分类:

题目描述

        或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及。在这种情况下,最好的帮手就是计算机。为了将问题简化,你将得到一些亲戚关系的信息,如Marry和Tom是亲戚,Tom和Ben是亲戚,等等。从这些信息中,你可以推出Marry和Ben是亲戚。请写一个程序,对于我们的关于亲戚关系的提问,以最快的速度给出答案。

输入

输入由两部分组成。
第一部分以N,M开始。N为问题涉及的人的个数(1≤N≤20000)。这些人的编号为1,2,3,…, N。下面有M行(1≤M≤1 000 000),每行有两个数ai, bi,表示已知ai和bi是亲戚。
第二部分以Q开始。以下Q行有Q个询问(1≤Q≤1 000 000),每行为ci, di,表示询问ci和di是否为亲戚。

输出

对于每个询问ci, di,输出一行:若ci和di为亲戚,则输出“Yes”,否则输出“No”。

样例输入

10 7 2 4 5 7 1 3 8 9 1 2 5 6 2 3 3 3 4 7 10 8 9

样例输出

Yes No Yes
var
 father:array[1..100000] of longint;
 n,m,k,i,a,b:longint;

Function getfather(v:longint):longint;
begin
 if father[v]=v then
   getfather:=v
 else
  begin
   father[v]:=getfather(father[v]);
   getfather:=father[v];
  end;
end;

Procedure int(a,b:longint);
var i,j:longint;
begin
 i:=getfather(a); j:=getfather(b);
 father[i]:=j;
end;
begin
 //assign(input,'input.txt'); reset(input);
 //assign(output,'output.txt'); rewrite(output);
 readln(n,m);
 for i:=1 to n do father[i]:=i;
 for i:=1 to m do
  begin
   read(a,b);
   int(a,b);
  end;
 readln(k);
 for i:=1 to k do
  begin
   read(a,b);
   if getfather(a)=getfather(b) then
   writeln('Yes') else writeln('No');
  end;
 //close(input); close(output);
end.
0
0

猜你在找
【直播】计算机视觉原理及实战——屈教授
【套餐】深度学习入门视频课程——唐宇迪
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】机器学习之凸优化——马博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14838次
    • 积分:106
    • 等级:
    • 排名:千里之外
    • 原创:91篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档