Tarjan算法(java实现).docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Tarjan算法(java实现).doc

最近看代码时看到Tarjan算法,搜索了一下,是个经典的求LCA(Least Common Ancestor)算法。奇怪的是,网上一般的介绍只会给出伪码,而且有关集合的实现都没有。为理解它还想了半天。目前有些细节还没有完全想清楚(主要和wikipedia上给出的伪码实现并不完全一致),但根据我的理解,我的实现应该是可以完成功能。 基本描述: ?? 本身是一个从根开始的深度优先搜索 1 为输入节点构建一个单节点的树 // MAKE_SET 2 对每个子节点,递归调用该算法完成子树内所有查询, ??? 再将子节点的ancester指向本节点,归并结果树? // UNION 3 处理完所有子节点后,将本节点标为checked 4 遍历查询集中和该节点有关的查询,检查另一个节点是否已标为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)

docinppt + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档