- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
并查集--李昊桦
不相交集合-并查集 李昊桦 例一:犯罪团伙 警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。有可能一个犯罪团伙只有一个人。 请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从1至n。 输入: 第一行:n(=10000,罪犯数量), 第二行:m(=100000,关系数量) 以下若干行:每行两个数:I 和j,中间一个空格隔开,表示罪犯i和罪犯j相互认识。 输出:一个整数,犯罪团伙的数量。 输入: 11 8 1 2 4 5 3 4 1 3 5 6 7 10 5 10 8 9 输出: 3 测试数据说明: n=1000,m=5000; 抽象算法 开始把n个人看成n个独立集合。 每读入两个有联系的人i和j,查找i和j所在的集合p和q,如果p和q是同一个集合,不作处理;如果p和q属于不同的集合,则合并p和q为一个集合。 最后统计集合的个数即可得到问题的解。 一类问题模型 需要将n个不同的元素划分成一组不相交的集合。开始时,每个元素自己成一个单元素集合,然后按照一定的顺序或问题给定的条件和要求将属于同一组元素(有特定关系)所在的集合合并,最后统计集合的个数往往就是问题的解。 在这个过程中要反复的用到查询某个元素属于哪个集合的运算;两个不同集合合并的运算。适合描述这类问题的抽象数据结构类型称为并查集(合并与查找)。 并查集一般以树形结构存储,多棵树构成一个森林,每棵树构成一个集合,树中的每个节点就是该集合的元素,找一个代表元素作为该树(集合)的祖先。 定义:father[x] : x的父亲节点。 1、Make_Set(x) 把每一个元素初始化为一个集合 初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身。 /* 初始化集合 */ void Make_Set(int x) { father[x] = x; } 2、Find_Set(x) 查找一个元素所在的集合 查找一个元素所在的集合,只要找到这个元素所在集合的祖先即可。判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。 int Find_Set(int x) /* 查找x元素所在的集合, */ { if (x != father[x]) return Find_Set(father[x]); return father[x]; } 3、Union(x,y) 合并x,y所在的两个集合 合并两个不相交集合的方法就是,找到其中一个集合的祖先,将另外一个集合的祖先指向它。 void Union(int x, int y) { x = Find_Set(x); y = Find_Set(y); if (x == y) return; else father[x] = y; } 并查集的优化 1、Find_Set(x)时 路径压缩 寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度 路径压缩:即当我们经过“递推”找到祖先节点后,“回归”的时候顺便将它的子孙节点都直接指向祖先,这样以后再次Find_Set(x)时复杂度就变成O(1)了。 int Find_Set(int x) /* 查找x元素所在的集合, */ { if (x != father[x]) return father[x]=Find_Set(father[x]); else return father[x]; } 例二 : 食物链 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。?现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。?有人用两种说法对这N个动物所构成的食物链关系进行描述:?第一种说法是1 X Y,表示X和Y是同类。?第二种说法是2 X Y,表示X吃Y。?此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。?1) 当前的话与前面的某些真的话冲突,就是假话;?2) 当前的话中X或Y比N大,就是假话;?3) 当前的话表示X
您可能关注的文档
最近下载
- 教科版小学科学四年级下册总复习试题(连线题).doc VIP
- 长虹LED42C2000黑屏故障通病维修方法分享.doc
- 教科版(2025秋)四年级科学下册总复习之连线题(含答案) .pdf VIP
- 2025年机修钳工(高级技师)职业技能鉴定理论考试题库资料(含答案).pdf
- 三字经全文带拼音完整版 打印版.pdf VIP
- 科教版小学科学四年级下册期末复习专项训练题04——连线题(含答案+详细解析).docx VIP
- 江苏省苏北四市(徐州、宿迁、淮安、连云港) 2025届高三第一次调研测试思想政治试题(含答案).pdf VIP
- 消防员心理培训课件.pptx VIP
- 2024年高考政治真题汇编《哲学与文化》.docx
- 风力发电场生态保护及恢复技术规范-DB21.PDF
文档评论(0)