并查集【信息技术】.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
信息学奥赛中的特殊数据结构——并查集 在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能采用一种全新的抽象的特殊数据结构——并查集来描述。 【绪论】 在讲述并查集之前,我们来看一个很简单的问题: 一个简单题:联系问题 。同样, (p,r) 代表 p 和 r 是相联系的。我们说, p,q,r 都是相联系的,即:具有传递性。我们的任务就是些程序来判断两个数是不是相联系的。 比如 有如下几个实数对 ( 1 , 2 )( 2 , 3 )( 3 , 4 )( 4 , 5 )( 1 , 6 )( 2 , 8 ) 我们需要问的是: 2 6 是不是相联系的。 ——我们题很快得知:他们是相联系的。 (1 2 相联系, 1 6 相联系, 2 6 显然相联系! ) 分析 实际上可以集合问题,将它数学化一点,就是 (p , q) 就表示 p , q 在同样一个集合中,而最终我们要判断 x , y 是不是在一个集合里面。很显然,题目不会告诉我们一个集合有多少个元素,分别是什么,他只会一次又一次地提示我们两个元素属于一个集合,而这个集合,我们去构造。然后,我们 x , y 在不在一个集合中。 拓展: 这在中有应用 1、 大型电网中,每次告诉我们两个点相联接,最后问 x , y 是不是相联接 2、 亲戚问题: 最后问: x , y 是否是亲戚 上面的我们发现,我们要构造出一庞大的关系网络,怎样很好的解决这些问题,我要讨论的是一种并查算法( Union-Find Algorithms ) ,对应于的抽象数据类型叫做——并查集 数学 首先,我们从数学的角度给出等价关系和等价类的定义: 如果集合S中的关系R是自反的,对称的,传递的,则称他为一个等价关系 ——自反x=x; ——对称若xy,则yx; ——传递若xy、y=z,则xz。 要求:x、y、z必须要同一个子集中 定义2:如果R是集合S的等价关系。对于任何x∈S,由[x]R{y|y∈S and xRy}给出的集合[x]R称为由x∈S生成的一个R的等价类。 若R是集合S上的一个等价关系,则由这个等价关系可产生这个集合的唯一划分。即可以按R将S划分为若干不相交的子集S1,S2,S3,S4……,他们的并即为S,则这些子集Si称为S的R等价类 划分等价类的问题的提法是:要求对S作出符合某些等价性条件的等价类的划分,S及一系列的形如x等价于y的具体条件,要求给出S的等价类的划分,符合所列等价性的条件。我们上面提到的联系,即可认为是一个等价关系,我们就是要将集合S划分成n个联系的子集,然后再判断x,y是否在一个联系子集中 亲戚(relations.pas) [问题描述] 或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。如果能得到完整的家谱,判断两个人是否是亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及。在这种情况下,最好的帮手是计算机。 为了将问题简化,你将得到一些亲戚关系的信息,如同Xuebin和Grant是亲戚,Grant和Tension是亲戚等,从这些信息中,你可以推出xuebin和Tension是亲戚。请写一个程序,对于我们的关于亲戚关系的提问,以最快的速度给出答案。 [数据输入] relations.in 第一行:三个整数n,m,p。(n=5000,m=5000,p=5000)分别表示有n个人,m个亲戚关系,询问p对亲戚关系。 以下m行:每行两个数Mi,Mj,1=Mi,Mj=n,表示Mi和Mj具有亲戚关系。 接下来p行:没行两个数Pi,Pj询问Pi和Pj是否具有亲戚关系。 [数据输出] relations.out P行,每行一个‘yes’或‘no’,表示第i个询问的答案为“具有”或“不具有”亲戚关系。 [样例输入] 8 6 2 1 2 2 3 3 4 4 5 1 6 2 8 2 6 2 4 [样例输出] yes yes 【算法分析】 1. 算法1,构造图论模型。 用一个n*n的二维数组描述上面的图形,记忆各个点之间的关系。然后,只要判断给定的两个点是否连通则可知两个元素是否有“亲戚”关系。 但要实现上述算法,我们遇到两个困难: (1)空间问题:需要n2的空间,而n高达5000! (2)时间问题:

文档评论(0)

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档