luoguP1551 亲戚

P1551 亲戚

题目背景

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。

题目描述

规定: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个询问的答案为“具有”或“不具有”亲戚关系。

输入输出样例

输入样例#1:

6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6

输出样例#1:

Yes
Yes
No

说明

非常简单的并查集入门题哦!!!

最初版本:

 1 program relation;
 2 const
 3   inf=‘relation.in‘;
 4   outf=‘relation.out‘;
 5 var
 6   father:array[0..20000] of longint;
 7   i,n,m,q,a,b,t1,t2:longint;
 8
 9 function find(apple:longint):longint;
10 begin
11     if father[apple]<>apple then father[apple]:=find(father[apple]);
12     exit(father[apple]);
13 end;
14
15 procedure union(aa,bb:longint);
16 begin
17     father[bb]:=aa;
18 end;
19
20
21 begin
22   //assign(input,inf);
23   //assign(output,outf);
24   //reset(input); rewrite(output);
25
26   readln(n,m,q);
27   for i:= 1 to n do
28     father[i]:=i;   //init;
29
30   for i:= 1 to m do
31    begin
32     read(a,b);
33     t1:=find(a);
34     t2:=find(b);
35     if t1<>t2 then union(t1,t2);
36    end;
37
38   for i:= 1 to q do   //ask
39     begin
40         readln(a,b);
41         if find(a)=find(b) then writeln(‘Yes‘)
42           else writeln(‘No‘);
43     end;
44
45   close(input);
46   close(output);
47 end.

优化版本:

 1 {
 2     并查集:
 3     先读入,然后找两个点的flag,然后合并(后面接着前面)
 4 }
 5
 6 program relation;
 7 const
 8   inf=‘relation.in‘;
 9   outf=‘relation.out‘;
10 var
11   father:array[0..20000] of longint;
12   i,n,m,q,a,b,t1,t2:longint;
13
14 function find(apple:longint):longint;
15 begin
16     if father[apple]<>apple then father[apple]:=find(father[apple]);
17     exit(father[apple]);
18 end;
19
20 procedure union(aa,bb:longint);
21 begin
22     father[bb]:=aa;
23 end;
24
25 begin
26   //assign(input,inf);
27   //assign(output,outf);
28   //reset(input); rewrite(output);
29
30   readln(n,m,q);
31   for i:= 1 to n do
32     father[i]:=i;   //init;
33
34   for i:= 1 to m do
35    begin
36     read(a,b);
37     t1:=find(a);
38     t2:=find(b);
39     if t1<>t2 then union(t1,t2);
40    end;
41
42   for i:= 1 to q do   //ask
43     begin
44         readln(a,b);
45         if find(a)=find(b) then writeln(‘Yes‘)
46           else writeln(‘No‘);
47     end;
48
49   close(input);
50   close(output);
51 end.
时间: 2024-08-10 02:09:23

luoguP1551 亲戚的相关文章

洛谷——P1551 亲戚

题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 题目描述 规定: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

并查集 亲戚

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

关于How,刷墙和亲戚

对于需求而言,最宏观的概念是六字诀: Who->Where->Which->How->End->Effect:谁(Who)在什么地方(Where),对那个对象(Which)做了什么(How),做完了(End),影响是什么(Effect): 在How上面要做的文章是最多的,How其实本质就是场景,操作,数据(对象). 刷墙 只要是被操作的数据就需要考虑是否需要添加状态,比如IMS审批从NPIOT系统中抽调的数据就需要考虑是否需要加状态,防止审批期间物料被移动:不加状态,就代表着

洛谷P1551亲戚 并查集

洛谷P1551亲戚   并查集  按秩合并 + 路径压缩 #include <bits/stdc++.h> using namespace std ; const int N = 5011 ; int fa[N],rk[N] ; int n,m,Q ; inline void init() { for(int i=1;i<=n;i++) fa[ i ] = i,rk[ i ] = 1 ; } inline int find(int x) { if(x==fa[ x ]) return x

极品亲戚

每逢年节,一定会有年轻人给我留言,抱怨家里的极品亲戚.有些是像我一样牛头不对马嘴:有些是出言不逊——你怎么又穿红,你皮肤黑穿红像村姑:有些是内夸不避亲——你堂姐上哈佛了,你要向她学习呀……最讨厌的是,几乎每一位都会问:“你考得怎么样?你有男(女)朋友没?你赚多少……” 年轻人都很想像网上说的那样,冷冷地回一句“关你屁事”,又怕爸妈一巴掌挥过来. 而此刻,我想替所有极品亲戚叫一声:“冤枉啊.” 年纪越大,越知道人的孤单.欢天喜地的时候,你想打电话分享的人没几个:痛不欲生的时候,你有满心的话想说,却

家族/亲戚(relation)

题目描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定: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

CODVES 5929 亲戚

5929 亲戚 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚. 输入描述 Input Description 第一行:三个整数n,m,p,(n<=5000,m<=5000,p<

uva 10099 The Tourist Guide nyoj 1019 亲戚来了【单个路线最大流【最短路算法】】

题目:uva 10099 The Tourist Guide nyoj 1019 亲戚来了 题意:给出一个无向图,每条路有一个容量.从 s 到 t 的一条最大的流量. 分析:这个题目可以用最短路的算法来做,最短路是求从 s 到 t 的最短路,这里是求从 s 到 t 的最小容量.最短路的三种算法都可以. nyoj的使我们比赛的题目,有坑,图有重边,要处理,还有s可能等于t. spfa代码: #include <cstdio> #include <iostream> #include

codevs 5929 亲戚

5929 亲戚 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚. 输入描述 Input Description 第一行:三个整数n,m,p,(n<=5000,m<=5000,p<