LCA
文章平均质量分 80
NightRaven
cust
展开
-
POJ 1330 Nearest Common Ancestors LCA
给一棵树,查询两个点的最近公共祖先。还是模板题,不过数据给的时候是按顺序给的,所以要直接存成从根节点到叶子节点的有向图,同时存一下每个点的入度用来找根节点,然后从根节点开始做一遍tarjan就行.. #include #include #include #include #include using namespace std;typedef long long ll;con原创 2014-01-25 14:59:33 · 602 阅读 · 0 评论 -
codeforces 379F New Year Tree 在线LCA
一棵树,根节点为1,有2,3,4三个叶子节点,接下来有N个操作,每个操作x,表示给节点x添加两个孩子节点,并且输出添加后树的直径。 当时做这套题的时候不会LCA,写了个暴力的爬山坡,结果复测时喜闻乐见的TLE了= =...现在学了LCA要果断虐回来...分别每次记录直径的两个端点各自的父亲节点d1,d2,初始值d1=d2=1,然后每次添加时,找一下x到d1和x到d2的距离那个更大,原创 2014-02-08 20:00:35 · 1160 阅读 · 2 评论 -
poj3237 暴力在线LCA
给一棵带权树,三种操作,查询x到y的的路径上最大的边权;修改第x条边的权值为y;取反x到y的路径上所有的边权。每次查询,求出lca,从x,y爬到lca点取最大值,修改直接改权值就行,取反同查询...一定是这题的数据太弱了...这么暴力的做法都给过......#include #include #include #include #include #include using nam原创 2014-02-08 03:30:36 · 1211 阅读 · 6 评论 -
poj2763 Housewife Wind 在线LCA+BIT
给一棵N个节点的边上带权树,给一个起点,接下来有M个操作,0 i:从当前位置走到i点,并且输出路径和;1 i w:把第i条边的权值变成w。整体上思路还是dis[x]+dis[y]-2*dis[lca(x,y)],但是更新时如果一条一条的去更新,显然会超时..这里可以结合dfs序和树状数组来实现更新和查询。首先dfs的时候给各个节点重新编号打上时间戳,这样每个节点的子树都会是一个连续的区间,那么某条原创 2014-02-08 16:23:23 · 732 阅读 · 0 评论 -
poj3417 Network LCA+DP
给一棵N个节点的树,添加M条边构成一个新的图。现在可以删除一条新边,删除一条老边,问有多少种删除方式,可以使得删除新老两条边后的图不再联通..这题思路也挺神奇的,果然是脑子太死板了不利于做dp的题么= =.....每增加一条新边,一定可以构成一个环,那么我们统计一下树上每条边分别被多少个环覆盖。如果某条边没有被环覆盖,那么它是一个桥,删除他之后,M条新边任意删一条都符合要求,所以ans+=m,如果原创 2014-02-08 01:43:22 · 672 阅读 · 0 评论 -
poj3694 Network 边双联通缩点+离线LCA
给一个联通的图,然后依次添加Q条边,每次添加边之后,图中还剩多少条桥?先求一下边双联通重构成一棵树,然后就是求LCA了,查询的时候从两个点开始往祖先一边爬一边标记掉沿途的边,根据每次标记掉的点以及上一次的答案就可以递推出当前的答案...切记一点这题有重边...所以求ebc的时候记得用边判父节点...思路不是很难,但代码写起来太坑爹了......#include #include #incl原创 2014-02-07 21:47:09 · 743 阅读 · 0 评论 -
poj3728 The merchant LCA(带权并查集?)
一个树有N个节点,每个节点可以买卖同一件物品,不同的节点价格也不相同,给出每个节点的价钱,Q次询问x,y对于每次询问求从x到y最大可以获取的利润。 离线LCA+带权并查集。带权并查集这类的题实在没怎么做过...这题看别人代码都看了好久才看明白...和裸地LCA不同的地方就是这里每个点要维护四个变量,up[x]表示从x到祖先可以获取的最大利润,down[x]表示从祖先到x可以获取的最大利原创 2014-02-06 23:52:28 · 835 阅读 · 0 评论 -
HDU 2586 How far away? LCA模板
给一棵树,若干个查询,每次查询树上两点的距离。第一道LCA的题..完全是裸的,把查询存起来,直接tarjan就可以。res[i][0],res[i][1],res[i][2]分别表示第i个查询的起点,终点和起点终点的最近公共祖先,记dis[x]为x到根节点的距离,那么dis(0,1)就是dis[0]+dis[1]-2*dis[2].#include #include #include #原创 2014-01-25 14:40:34 · 674 阅读 · 0 评论 -
POJ1470 Closest Common Ancestors LCA
依然是没什么难度的模板题..不过查询的时候,没给上限.数组开小就就RE了= =,还有就是根节点要自己找一下..#include #include #include #include #include using namespace std;typedef long long ll;const int maxn=1000;int n,m,p;struct EDGE{原创 2014-01-25 16:35:24 · 697 阅读 · 0 评论 -
POJ 1986 Distance Queries LCA
带边权的LCA,记录Dis[x]为根到x的距离,有dis[x,y]=dis[x]+dis[y]-2*dis[lca(x,y)]。#include #include #include #include #include using namespace std;typedef long long ll;const int maxn=44000;struct node{ i原创 2014-01-25 18:11:33 · 670 阅读 · 0 评论 -
倍增LCA模板
原帖在这:http://blog.csdn.net/crazy_ac/article/details/7796497LCA可以离线tarjan去求,也可以在线倍增去求。记二维数组p[u][i]表示u的2^i个祖先是谁,i==0就是父节点。那么可以通过 p[u][i]=p[p[u][i-1]][i-1]来递推出所有的情况,然后再求lca(x,y)的时候,根据x,y的深度,先将深度大的点通过p原创 2014-02-08 02:46:39 · 711 阅读 · 0 评论