博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用并查集合并不同的集合
阅读量:4945 次
发布时间:2019-06-11

本文共 1199 字,大约阅读时间需要 3 分钟。

Description
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
Input
第一行:三个整数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
P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。

Sample Input

6 5 31 21 53 45 21 31 42 35 6

Sample Output

YesYesNo
View Code
#include
using namespace std;#define size 5001int father[size];int find(int k){ return father[k]==k?k:father[k]=find(father[k]);}int main(){ int n, m, p, former, later; cin>>n>>m>>p; for(int i=1; i<=n; i++) father[i]=i; for(int i=0; i
>former>>later; father[find(former)]= find(later); //将其中一个集合的根结点全部赋值到另一个集合的根结点,这样就能将两个不同的集合合并了 } //上面的合并并不是真正意义上的合并,因为只用根结点进行了合并,并没有将所有点进行合并 //真正的合并的做法是,从头到尾再合并一次就可以了 //for(int i=1; i<=n; i++){ // father[i] = find(i); //} //这个很重要啊~~~~~~~~~~~~~~~~ //只要加上了这句话,下面就可以直接用f[]=?f[]了。 for(int i=0; i
>former>>later; if(find(former)==find(later)) cout<<"Yes"<
 

 

 

转载于:https://www.cnblogs.com/o8le/archive/2011/10/29/2228849.html

你可能感兴趣的文章
BZOJ1645 [Usaco2007 Open]City Horizon 城市地平线
查看>>
配置IIS
查看>>
单例模式详解
查看>>
电商项目(下)
查看>>
[NOIP2015] 子串
查看>>
NSSet和NSArray区别与方法总结
查看>>
Python列表 元组 字典 集合
查看>>
foreach遍历数组、数组的转置与方阵的迹
查看>>
Still unable to dial persistent://blog.csdn.net:80 after 3 attempts
查看>>
HTML超文本标记语言(九)——表单输入类型
查看>>
基于busybox制作mini2440根文件系统及使用nfs挂载
查看>>
信道容量及信道编码原理学习
查看>>
浅谈独立特征(independent features)、潜在特征(underlying features)提取、以及它们在网络安全中的应用...
查看>>
从随机过程的熵率和马尔科夫稳态过程引出的一些思考 - 人生逃不过一场马尔科夫稳态...
查看>>
《A First Course in Abstract Algebra with Applications》-chaper1-数论-关于素数
查看>>
ORA-3136
查看>>
算法笔记_145:拓扑排序的应用(Java)
查看>>
JS获取农历日期
查看>>
PHP中的HTTP协议
查看>>
CSS给文字描边实现发光文字
查看>>