概念: 对于有根树T的两个节点u,v,最近公共祖先LCA(T, u, v)表示一个节点 x, 满足 x 是 u , v 的祖先且 x 的深度尽可能的大.即从 u 到 v 的路径一定经过点 x. 算法: 解决LCA问题比较经典的是Tarjan - LCA 离线算法,还有另外一种方法,是经过一系列处理将 ...
分类:
其他好文 时间:
2016-08-13 15:30:30
阅读次数:
130
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 最近公共祖先问题~~ 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起来,接下了有m次询问,每次询问两个房子a,b之间的距离是多少。 很明显的最近公共祖先问题,先建一棵树,然后求出每一 ...
分类:
其他好文 时间:
2016-08-10 20:57:35
阅读次数:
209
题目中的描述就很最近公共祖先,再说其实这个题并不难,就是麻烦点(代码其实可以化简的),我写的判定比较多。 方法;求出两者的最近公共祖先lca,在求出两者到lca的距离 分析:给出a和b,如果LCA(a,b) == a或者b,那他们肯定是窒息的,是父子,爷孙之类的关系。 如果LCA(a,b)> a 和 ...
分类:
其他好文 时间:
2016-08-07 15:14:34
阅读次数:
147
#include<iostream>
usingnamespacestd;
template<classT>
structBinaryTreeNode
{
BinaryTreeNode<T>(constT&data)
:_data(data)
,_left(NULL)
,_right(NULL)
{}
T_data;
BinaryTreeNode<T>*_left;
BinaryTreeNode<T>*_right;
};
template&..
分类:
其他好文 时间:
2016-08-07 01:00:49
阅读次数:
169
A - Nearest Common Ancestors Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%lld & %llu Submit Status A - Nearest Common Ancestors Submit Stat ...
分类:
其他好文 时间:
2016-08-05 11:53:43
阅读次数:
119
题目描述:一个二叉搜索树,给定两个节点a,b,求最小的公共祖先 _______6______
/ ___2__ ___8__
/ \ / 0 _4 7 9
/ 3 5例如:2,8 —->6...
分类:
编程语言 时间:
2016-07-30 12:14:38
阅读次数:
184
对于这一类的问题有2中解决方法。第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法。复杂度都是O(n); 先介绍在线算法: 1) dfs: 对于图所示的树,我们从根节点1开始dfs,按照先序访问(不算完全的先序),那么它访问顺序就是1 -> 2 -> 4 -> 2 -> 5 -> 7 ...
分类:
编程语言 时间:
2016-07-13 10:28:51
阅读次数:
139
马克飞象莫名其妙无法同步到印象笔记,现在这里保存一下吧。Training Day2@(ACM集训)A.How far away ?(Tarjan LCA)题意:无向图,给定边及边权重,任意两点之间都有一条唯一的道路,道路上每个点只能出现一次。给定询问,求询问的结点之间的距离。分析:路上每个点只能出现一次,可以转化成有根树,问题也即为求最近公共祖先问题~~ 这里每条边加上了距离,求出LCA后,用u、v...
分类:
其他好文 时间:
2016-07-10 18:43:57
阅读次数:
205
题意:给定一棵树,询问两个节点的最近公共祖先。 输入:第一行T,表示测试组数。 每组测试数据包含一个n,表示节点数目,下面n-1行是连接的边,最后一行是询问 输出:共T行,代表每组的测试结果 /* 倍增LCA 注意这是树,所以边是单向的,深搜的时候从根节点开始搜 */ #include<cstdio ...
分类:
其他好文 时间:
2016-07-09 20:53:30
阅读次数:
174
倍增算法可以在线求树上两个点的LCA,时间复杂度为nlogn 预处理:通过dfs遍历,记录每个节点到根节点的距离dist[u],深度d[u] init()求出树上每个节点u的2^i祖先p[u][i] 求最近公共祖先,根据两个节点的的深度,如不同,向上调整深度大的节点,使得两个节点在同一层上,如果正好 ...
分类:
编程语言 时间:
2016-07-09 13:31:49
阅读次数:
171