- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Tarjan算法(java实现).doc
最近看代码时看到Tarjan算法,搜索了一下,是个经典的求LCA(Least Common Ancestor)算法。奇怪的是,网上一般的介绍只会给出伪码,而且有关集合的实现都没有。为理解它还想了半天。目前有些细节还没有完全想清楚(主要和wikipedia上给出的伪码实现并不完全一致),但根据我的理解,我的实现应该是可以完成功能。基本描述:?? 本身是一个从根开始的深度优先搜索1 为输入节点构建一个单节点的树 // MAKE_SET2 对每个子节点,递归调用该算法完成子树内所有查询,??? 再将子节点的ancester指向本节点,归并结果树? // UNION3 处理完所有子节点后,将本节点标为checked4 遍历查询集中和该节点有关的查询,检查另一个节点是否已标为checked,如果是的话说明???? 1) 该节点在本节点的子树???? 2) 该节点和本节点在另一节点的子树中,而且该节点已被查询???? 无论哪种情况,检查该节点所在树的根就是这两个节点的LCA节点???? 如果没有标识checked,只需简单跳过,当遍历到该节点时就可以完成查询了下面是java的实现代码import?java.util.*;public?class?Tarjan{????????static?void?lca(?Node?p,?ArrayListQuery?q?){????????????????MAKE_SET(p);????????????????//FIND(p).ancester=p;????????????????for(?Node?i?:?p.childs){????????????????????????lca(?i,?q?);????????????????????????UNION(?p,?i?);????????????????????????FIND(p).ancester=p;????????????????}????????????????p.checked=true;????????????????for(?Query?query?:?q?){????????????????????????if(?query.p1==p?){????????????????????????????????if(?query.p2.checked?){????????????????????????????????????????query.result=FIND(query.p2);????????????????????????????????}????????????????????????}else?if(?query.p2==p?){????????????????????????????????if(?query.p1.checked?){????????????????????????????????????????query.result=FIND(query.p1);????????????????????????????????}????????????????????????}else{????????????????????????????????continue;????????????????????????}????????????????}????????}????????static?void?MAKE_SET(?Node?p?){????????????????p.ancester?=?p;????????}????????static?Node?FIND(?Node?p?){????????????????Node?r=p;????????????????for(?;?r.ancester!=r;?r=r.ancester?);????????????????return?r;????????}????????static?void?UNION(?Node?p,?Node?q?){????????????????q.ancester=p;????????}????????public?static?void?main(?String?args[]?){????????????????//?create?tree????????????????Node?p[]=new?Node[24];????????????????p[0]=new?Node(0,null);??//?root????????????????p[1]=new?Node(1,p[0]);???????????????
文档评论(0)