
最近公共祖先
ITCharge
高效率编程,慢节奏生活。
展开
-
POJ1330 Nearest Common Ancestors【最近公共祖先】【Tarjan-LCA算法】
题目大意:给你一棵树,有N个结点,N-1条边。最后询问距离树上两个点(u,v)最近的 公共祖先是多少。 比如上图:6和16的最近公共祖先就是4;14和1的最近公共祖先就是1。 思路:对于最近公共祖先LCA问题,最经典的离线算法是Tarjan-LCA算法。用链式前向 星存储图和询问,Head[]和Edges[]表示图(树),QHead[]和QEdges[]表示询问。集合 的操作用并查集实现。这道题里用了indegree[]数组来存储结点的入度,找到入度为0的 根结点root,调用LCA(root)。 Tarj原创 2014-12-31 20:42:20 · 942 阅读 · 0 评论 -
POJ1986 Distance Queries【最近公共祖先】【Tarjan-LCA算法】
题目大意:John是一个农场主,他的牛很懒,拒绝按照John选的路走。John不得不找一条 最短的路。这道题的输入前半部分和POJ1984"Navigation Nightmare"相同。在每组数据 之后是一个整数K,接下来K行是询问(u,v)的曼哈顿距离(u,v是农场编号)。最后输出所有 询问结果。 POJ1984链接:http://poj.org/problem?id=1984 思路:本题输入有些特殊,给出的是某点在某点的某个方向(东西南北)有多远。由于输入数 据比较特殊。全部是有向边,且构不成回路,所原创 2014-12-31 21:02:06 · 3916 阅读 · 0 评论 -
HDU2586 How far away ?【最近公共祖先】【Tarjan-LCA算法】
题目大意:一个村庄有N个房子和一些双向的路,人们总是喜欢问"A到B有多远呢",一般是很难 回答的,毕竟有很多种答案。所幸,答案是唯一的,A到B总是有唯一的路径到达。第一行是T组 数据。每组数据第一行是N个房子和M条询问。接下来N-1行每行是u v w,表示从房子u到房子v 的距离是w。接下来是M行询问。每行是u v,表示询问房子u到房子v的距离,最后输出所有的询 问结果。 思路:整个村庄房子和路可看成一棵树,设根结点为房子1,询问u到房子v的距离,其实就是求u 到根结点的距离 + v到根结点的距离 - 2*原创 2014-12-31 21:53:16 · 1283 阅读 · 0 评论 -
最近公共祖先LCA【模板】
Tarjan-LCA算法: 对于每一点u: 1.建立以u为代表元素的集合。 2.遍历与u相连的节点v,如果没有被访问过,对于v使用Tarjan-LCA算法,结束后,将v的集合并入u的集合。 3.对于与节点u相关的询问(u,v),如果v被访问过,则结果就是v所在集合的所代表的元素。求(u,v)的最近公共祖先节点,则询问时调用QEdges[k].lca = find(QEdges[k].to);原创 2015-05-04 11:17:58 · 1307 阅读 · 0 评论