- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第11章不相交集
Find函数的实现 关键问题:如何在查找的过程中改变结点的父结点? int DisjointSet::Find(int x) { if (parent[x] 0) return x; return parent[x] = Find(parent[x]); //利用递归函数调用时的回溯过程,将根结点的下标赋给路径上的各个结点 } Union函数的实现 void DisjointSet::Union(int root1, int root2) { if (root1 == root2) return; //为同一棵树,直接返回 if (parent[root1] parent[root2]) //值为负数 { parent[root2] += parent[root1]; parent[root1] = root2;} //将规模小的树作为规模大的树的子树 else { parent[root1] += parent[root2]; parent[root2] = root1;} } 第11章 不相交集合类 主要用来解决等价问题 等价关系与等价类 不相交集 不相交集的实现 不相交集类的实现 不相交集的应用 不相交集的应用 迷宫问题 最近共同祖先问题 其它 Games (Go, Hex). Dynamic connectivity. Equivalence of finite state automata. Hoshen-Kopelman algorithm in physics. Compiling equivalence statements in Fortran. Morphological attribute openings and closings. Matlabs bwlabel() function in image processing. 应用—迷宫问题 把迷宫看成由M×N个矩形单元组成,入口在左上角,出口在右下角。左上角的单元与右下角的单元是连通的,单元之间用墙隔开。 一个5×5的迷宫 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 生成迷宫的算法 开始时假设所有的地方都有墙(除了入口和出口),所有的单元都不连通。 我们不断地随机选择一堵墙,如果由该墙分割的单元互相之间没有连通,则把墙拆除。 重复上述过程,直到连通了入口和出口,就得到了一个迷宫。 继续拆墙直到从每一个单元都能到达其他任一单元当然更好,因为这样做会在迷宫中生成更多的错误路径 算法实现 连通关系是一个等价关系。 迷宫问题转化成等价类的归并问题。 开始时,每个单元是一个等价类。 选择相邻两个单元,判别是否在一个等价类。如果不是,敲开两个单元之间的墙,使之连通。归并两个等价类。 重复上述过程,直到所有单元都在一个等价类中。 初始的配置 某些墙已经被拆除。此时,如果我们随机选择8和13之间的墙,这堵墙不用拆掉,因为8和13已经连通 我们随机选择了18和13之间的墙;因为18和13没有连通,这堵墙被拆除 void createPuzzle(int size) //size为迷宫的规模 { int num1, num2; DisjointSet ds(size*size); //不相交集有size*size个单元 srand(time(0)); //初始化随机数发生器 while (ds.Find(0) != ds.Find(size*size-1)) { //入口和出口不在一个集合则循环 while (true) { //选择两个相邻的不连通单元num1, num2 num1 = rand() * size * size / (RAND_MAX + 1); //随机选择一个单元, num2 = num1-size; //检查上方的单元 if (num2 = 0) if (ds.Find(num1) != ds.Find(num2)) break; num2 = num1 - 1; //检查左边的单元 if (num1 % size != 0) if (ds.Find(num1) != ds.Find(num2)) break; num2 = num1 + size; //检查下方的单元 if (num2 size * size) if (ds.Find(num1) != ds.Find(num2)) break; num2 = num1 + 1;
您可能关注的文档
最近下载
- 突发事件之车站大客流组织讲解.pptx VIP
- 普天新能源民乐光伏储能微电网项目设计方案.pdf VIP
- 盾构法施工简介 中铁隧道.pptx VIP
- 乡镇宣传工作课件.pptx VIP
- DB36T+2132-2025行政执法案卷评查规范.pdf VIP
- 护理三基考试题库7000题.pdf VIP
- 中华人民共和国人民陪审员法全文必威体育精装版解读课件.pptx VIP
- 新能源行业光储能微电网能量管理系统解决方案【50页PPT】.pptx VIP
- 电力系统分析理(第二版 刘天琪 邱晓燕)课后思考题答案(不包括计算).doc VIP
- 4 古代诗歌四首《次北固山下》 王湾 教学课件 初中语文统编版(2024)七年级上册 第一单元.pptx
文档评论(0)