- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * 有时,还要进一步优化,如:权小的(个数少的)向权大的合并. * * 并查集的引入 并查集(Union-Find Set) OI的比赛中,经常会有一类这样的问题:给一些集合,不断要求作“合并两个集合”和“查找两个元素是否在一个集合中”的操作。如:是否等价关系的维护、图中点是否连通的判断,等等。 对于这类问题,已经有时间效率也很好的专用数据结构:并查集 并查集的引入 并查集(Union-Find Set) 并查集问题模型: 图中有N个点,开始不连通。不断添加一些无向边,问某两点x,y是否连通 或 问有多少个连通块。 并查集经典问题(参见附件“并查集初步”):例1 亲戚例2 银河英雄传说(NOI2002)例3 食物链(NOI2001) 并查集中集合的特点 并查集(Union-Find Set) 是一组不相交的集合。即集合之间没有公共元素,它们的交集是空集。 因此没有“求集合的交集”和“求集合的差集” 操作。 至于“求集合的并集”运算,则只需简单地将两个集合的元素合并在一起就行了,不用考虑剔除重复元素的问题。 并查集示实现意图 并查集(Union-Find Set) 并查集中的一个集合为一棵“树” 初始化: 合并4,6: 并查集示实现意图 并查集(Union-Find Set) 并查集中集合为“森林”,每个树的根相当于“此集合的标号” 合并1,2: 并查集示实现意图 并查集(Union-Find Set) 并查集中合并只要改变根“father指针” 合并0,4: 并查集示实现意图 并查集(Union-Find Set) 合并2,4:(先找到2,4的根,再合并) 并查集程序实现pascak版 并查集(Union-Find Set) 同其它数据结构一样,这里再次用数组作“容器”来实现。 Var fa :array[0..maxN] of longint; 初始化: for i:=0 to N do fa[i]:=i; 并查集程序实现pascak版 并查集(Union-Find Set) 同其它数据结构一样,这里再次用数组作“容器”来实现。 查找第i个元素所在树的根: function getFather(i:longit):longint; Begin while fa[i] i do i:=fa[i]; exit(i); End; 并查集程序实现pascak版 并查集(Union-Find Set) 合并(i,j): function union(i,j:longit):longint; var r1,r2:longint; Begin r1:=getFather(i); //求i所在集合的根 r2:=getFather(j); //求j所在集合的根 if r1r2 then fa[r1]:=r2; //在不同集合则全合并 End; 并查集“退化”问题 并查集(Union-Find Set) 树的“退化”是指树的深度过深,引起查找效率低。如下图所示,左图比右图“退化”: 并查集“退化”问题 并查集(Union-Find Set) 并查集中“退化”可以用“压缩路径技术”简单处理即可。一般你可以认为并查集的时间复杂度为常数O(5)。修改的程序如下: function getFather(i:longit):longint; Begin if fa[i]=i then exit(i); fa[i]:=getFather(fa[i]); exit(fa[i]); End; 并查集应用实例 并查集(Union-Find Set) 亲戚(family) 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 规定: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个询问的答案为“具有”或“不具有”亲戚关系。 “亲戚“pascal版 并查集(Union-Find Set) program family; var root:array[0..5000]of longint; i,j,k,m,n,p,x,y,r1,r2: longint; function find
您可能关注的文档
最近下载
- 互动式数字营销策略.pptx VIP
- 《Arm Cortex-M4嵌入式系统——基于STM32Cube和HAL库的开发方法》李正军教材 ppt课件. 第11章 STM32 AD转换器.ppt VIP
- 莆田市2024-2025学年七年级上学期语文月考测试试卷.doc VIP
- 高中课件:公开课:主线式情境教学——反射.pptx
- 抗真菌药临床应用.pptx VIP
- 标准图集-20S515-钢筋混凝土及砖砌排水检查井.pdf VIP
- 中专语文活动策划文案.docx VIP
- 2023《回弹法检测混凝土抗压强度技术规程》.pdf VIP
- DB33绿色信贷实施指南.pdf VIP
- 活动1 小游戏-翻花绳.ppt VIP
原创力文档


文档评论(0)