题目描述 Description

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。

输入描述 Input Description

第一行:三个整数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是否具有亲戚关系。

输出描述 Output Description

P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。

样例输入 Sample Input

6 5 3

1 2

1 5

3 4

5 2

1 3

1 4

2 3

5 6

样例输出 Sample Output

Yes

Yes

No

数据范围及提示 Data Size & Hint

n<=5000,m<=5000,p<=5000

类型:图论  难度:1.5

题意:给出n个点的m个等价类关系(给出a b表示ab属于同一个集合,具有传递性和可逆性),给出p个询问,每个查询输出两个数是否在一个集合中。

分析:典型的并查集问题,即初始时,将n个数看成n个集合,每次给出a,b时,合并ab所在的两个集合。

用树存储集合,fa[i]表示点i的父节点,初始化fa[i]=i,每次合并i,j所在的集合时,分别找到i,j所在树的根节点,如x,y,然后 fa[x]=y。

查询i,j所在集合时,找到i,j所在树的根节点,比较是否相同。

关于上述算法,有两个经典优化方法:

1、每次查询时,将查询点到根节点路径上的所有点的父节点置为根节点,降低树的高度,方便下次查询。

2、合并集合时,将高度低的树合并到高的树中,如height(a)>height(b),那么father[b] = a。

注意:看了大部分人的代码,没有做2这个优化。我估计原因是由于在合并操作中,会调用查询操作(先要查询需合并两个点的根节点才能合并,我也在这犯了一个错误),而查询操作已经做了1的优化,第2个优化就有点多余了(做了1的优化,树的高度也不好记录了),所以在实际实现中,第2个优化用的较少。

代码:

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,p;
int fa[5010];
int mfind(int a)
{
if(fa[a] != a) fa[a] = mfind(fa[a]);
return fa[a];
}
void mmerge(int a,int b)
{
fa[mfind(a)] = mfind(b);
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1; i<=n; i++)
fa[i] = i;
int a,b;
while(m--)
{
scanf("%d%d",&a,&b);
mmerge(a,b);
}
while(p--)
{
scanf("%d%d",&a,&b);
if(mfind(a) == mfind(b))
printf("Yes\n");
else
printf("No\n");
}
}

wikioi-天梯-进入省队-并查集-1073:家族相关推荐

  1. *【PAT天梯】分而治之(并查集,暴力)

    题干: L2-1 分而治之 (25 分) 分而治之,各个击破是兵家常用的策略之一.在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破.为此参谋部提供了若干打击方案 ...

  2. L2-010. 排座位-PAT团体程序设计天梯赛GPLT(并查集)

    布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输入格式: ...

  3. L3-003. 社交集群-PAT团体程序设计天梯赛GPLT(并查集)

    在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友.有部分兴趣相同的人们就形成了"社交集群".现请你编写程序,找出所有的集群. 输入格式: 输入的第一 ...

  4. 【并查集】家族 (ssl 1896)

    家族 ssl 1896 题目大意: 合并一些集合,然后判断某两个点是否在同一个集合内 原题: 题目描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出 ...

  5. BZOJ4358: permu(带撤销并查集 不删除莫队)

    题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...

  6. C++学习之路 | PTA(天梯赛)—— L2-007 家庭房产 (25分)(带注释)(并查集)(精简)

    L2-007 家庭房产 (25分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按 ...

  7. C++学习之路 | PTA(天梯赛)—— L2-010 排座位 (25分)(带注释)(并查集)(精简)

    L2-010 排座位 (25分) 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他 ...

  8. C++学习之路 | PTA(天梯赛)—— L2-013 红色警报 (25分)(带注释)(并查集)(精简)

    L2-013 红色警报 (25分) 战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通, ...

  9. C++学习之路 | PTA(天梯赛)—— L2-024 部落 (25分)(带注释)(并查集)(精简)

    L2-024 部落 (25分) 在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈.我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部 ...

最新文章

  1. CTFshow 命令执行 web48
  2. 《Java程序设计》实验报告——Java的接口与继承
  3. java爬虫工具xpath提取,2020-07-16--爬虫数据提取--xpath
  4. unexpected end of file while looking for precompiled header directive解决方法
  5. enctype =#39;multipart / form-data#39;是什么意思?
  6. Echarts数据可视化series-pie饼图,开发全解+完美注释
  7. 深入体验java项目开发 pdf,深入体验Java Web项目开发.pdf
  8. PHP将汉字转化为拼音
  9. matlab读取地震波数据,基于Matlab的人工地震波程序编写
  10. 项目开发计划(GB856T——88)
  11. 证件照素材大合集(全网最全版本)
  12. java连接打印机_JAVA连接打印机详解(有驱动,无驱动两种方式)
  13. 有效使用网易有道词典客户端
  14. App登录方式和测试重点总结
  15. 关于python注释说法错误的是_关于 Python 语言的注释,以下选项中描述错误的是:...
  16. XMLHttpRequest请求跨域问题解决方案
  17. 国产操作系统Deepin的安装
  18. 虚拟机的网络改为桥接网络
  19. C语言--实现状态机
  20. 数据分析的绩效应该这样来考核

热门文章

  1. 浏览器常见的4个安全风险你中招了吗?安全浏览网页的方法
  2. java使用easyExcel生成excel文件直接写入邮件附件并发送
  3. 为什么老外一个人能带宝宝,中国要一家子?
  4. C++ strtok_s() 分割字符串
  5. python中run函数作用_Python subprocess中的run方法
  6. fm算法详解_FM算法(一):算法理论
  7. 安信可博客导航一站式搜索(所有博客的汇总帖)
  8. mgc token白皮书
  9. matplotlib绘制极坐标图
  10. 说一下vue响应式原理?可不只有proxy