http://poj.org/problem?id=1330给一个有根树,一个查询节点(u,v)的最近公共祖先836K 16MS#include
#include
#include
#include
#include
#include
#include
#include<map...
分类:
其他好文 时间:
2015-03-13 12:43:43
阅读次数:
114
题目连接http://hihocoder.com/problemset/problem/1067题目大意就是一棵树求任意两个节点的最近公共祖先。算法描述在题目的提示里面有比较详细的解释。这里就不多说了。这种算法的时间复杂度是O(n+q)。
在算法的实现上也有一些技巧,在参考了一些代码后写了一个比较精简的Trajan_LAC算法。#include
using name...
分类:
其他好文 时间:
2015-03-09 14:30:48
阅读次数:
132
裸题,树状数组区间修改+单点查询。当然要稍微讨论一下链的左右端点是否修改的情况咯。#include#include#includeusing namespace std;#define N 300001int en,v[Nsiz[son[U]]) son[U]=v[i]; ...
分类:
编程语言 时间:
2015-03-09 14:26:55
阅读次数:
142
裸题,但是因为权在边上,所以要先把边权放到这条边的子节点上,然后进行链更新/查询的时候不能更新/查询其lca。#include#include#includeusing namespace std;#define N 100001#define BN 320#define INF 214748364...
分类:
其他好文 时间:
2015-03-08 18:46:58
阅读次数:
460
T组数据,每组数据给出N个点和N-1条边,每条边先给出父结点,最后一行查询一对结点,输出它们的最近公共祖先。...
分类:
其他好文 时间:
2015-03-07 14:08:58
阅读次数:
169
原理讲解:http://dongxicheng.org/structure/lca-rmq/
在线算法模板:
/**
LCA在线算法O(nlogn)
主函数调用:
init();
tot=0,dir[1]=0;
dfs(1,1);
ST(2*n-1);
int lca=LCA(u,v);
*/
#include
#include
#include
#include
#inclu...
分类:
编程语言 时间:
2015-03-01 18:33:50
阅读次数:
168
转自http://www.cnblogs.com/whatbeg/p/3765624.html首先将原图中的连通分量缩点,一定可以将原图缩成一棵树的形式,然后统计这棵树的叶子节点个数,答案就是(leaf+1)/2。这里不再证明,可以画个图看一下。(简单说明一下,首先把两个最近公共祖先最远的两个叶节点...
分类:
其他好文 时间:
2015-02-28 18:35:47
阅读次数:
207
树上任意两点的最近祖先,必定就是这两个节点的最短路径上深度最小的那个点。例如:下图中,节点7和5,其最短路径为7--4--1--5, 这条路径上深度最小的点为节点1,其深度为1.节点1即为节点7和5的LCA。因此,要找到任意两个节点的LCA,只需要先找到上述最短路径,再找到最短路径中深度最小的点。而...
分类:
编程语言 时间:
2015-02-21 20:59:24
阅读次数:
949
tarjan算法是处理最近公共祖先问题的一种离线算法。算法思路:先将所有的询问搜集起来。然后对树进行dfs,在dfs的过程中对节点进行着色。当到达某个节点x的时候,给x着色为灰色,离开x的时候,着色为黑色。当到达x并将其着色为灰色后,处理与x相关联的所有询问:(这里有一个显然的事实:所有的灰色节点都...
分类:
编程语言 时间:
2015-02-21 14:19:52
阅读次数:
222
问题描述:已知人名构成的父子关系树(或者森林),对于给定的两个人名name1和name2,求其最近公共祖先。题目保证人名不重复。分析:利用C++ STL中的map和set容器可以很方便的实现。用map容器存储父子关系。对于每一个询问,先将从name1开始到树根的路径上的所有人名放入一个set容器,然...
分类:
其他好文 时间:
2015-02-20 18:36:15
阅读次数:
164