lca tarjin
这个算法 我个人认为是 遍历每一个点把它当成一些询问的最近祖先
1
2 3
4 5 6
low是并差集,vis是是否访问过,访问过为true,没有为false;
假设询问是(4,4),(4,5),(2,6),(3,6)
按程序最先递归到4点,之后4没有了后继节点,
vis[4] = true;
证明4已经访问过了,然后就开始遍历4的询问,发现4有两个询问,第一个是(4,4),现在4是true,
那么就是说4是到过的点,然后我们就find祖先,因为没有点进行low数组的更新(就是当前节点low值没有指向父节点),意味着父祖先卡死在了4这个点,输出4
然后发现(4,5)也是一个询问,但是明显vis[5] = false;那么就不进行查找
回到2点,跟新low[4] = 2,然后发现
2除了4,没有后继节点,
vis[2] =true;
有一个询问(2,6)但是vis[6] = false;所以不find。
然后回到1,跟新 low[2] = 1;
进入右边的3,又进入了右边的5,没有后继节点,
之后看询问,发现有一个询问就是我们没有处理的(4,5),这时候发现vis[4] = true于是find(4) == 1
回到3点,跟新low值low[5] = 3;
进入6点
进入6发现
6点没有子节点,
vis[6] = true
有一个2,6询问,这时2,6都是true之后find(2) == 1,
有一个(3,6)询问,但是3是false,不询问,返回3点
返回3点
low[6] = 3;
3点走完了子节点
vis[3] = true;
有一个(3,6)询问,vis[3] && vis[6] 所以find(6) == 3
3走完了返回1
返回1,low[3] = 1
子节点走完了
vis[1] = true;
没有询问
程序结束
bb这么多,画一遍图就明白了,我觉得这个东西像一个树的合并,每次返回到上一层都是一次合并,就像(4,5)的询问一样,
我认为这时候是1的左子树和右子树进行了合并,而我们递归是一层层向上返回的,所以找到的第一个点就是合并的那个点
这个东西我个感觉为和tarjin算法关系不是很大,但是网上很多求法都说lca用tarjin算法,我估计还是我这个对tarjin算法的理解不够到位,
要是那里说的不对,还是请多指点一下
void lca(int u)
{
int i,j;
vis[u] = true;
for(i = 0;i < pp[u].size(); ++i)
{
j = pp[u][i];
if(vis[j] == true)
cout << findx(u) << endl;
}
for(i = 0; i < p[u].size(); ++i)
{
j = p[u][i];
lca(j);
low[j] = u;
}
}
int findx(int x)
{
if(x == low[x])
return x;
return low[x];
}
lca tarjin的更多相关文章
- Network-POJ3694(最小公共祖先LCA+Tarjin)
http://poj.org/problem?id=3694 这一题 为什么要找最小祖先呢 当两个节点连到一块的时候 找最小公共节点就相当于找强连通分支 再找最小公共节点的过程中直到找到 这个过 ...
- POJ3694 Network(连通图+LCA)
题目链接:http://poj.org/problem?id=3694 题目大意:给定一个图,每次添加一条边(可能有重边).输出每次添加后桥的 数目.由于添加边的次数比较多,添加一次Tarjin一次明 ...
- hdu 4674 Trip Advisor(缩点+倍增lca)
花了一天半的时间,才把这道题ac= = 确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...
- poj 1986 Distance Queries(LCA:倍增/离线)
计算树上的路径长度.input要去查poj 1984. 任意建一棵树,利用树形结构,将问题转化为u,v,lca(u,v)三个点到根的距离.输出d[u]+d[v]-2*d[lca(u,v)]. 倍增求解 ...
- poj 1330 Nearest Common Ancestors(LCA:最近公共祖先)
多校第七场考了一道lca,那么就挑一道水题学习一下吧= = 最简单暴力的方法:建好树后,输入询问的点u,v,先把u全部的祖先标记掉,然后沿着v->rt(根)的顺序检查,第一个被u标记的点即为u, ...
- 树剖LCA讲解
LCA的类型多种多样,只说我知道的,就有倍增求LCA,tarjin求LCA和树链剖分求LCA,当然,也还有很多其他的方法. 其中最常用,速度最快的莫过于树链剖分的LCA了. 树链剖分,首先字面理解一下 ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
随机推荐
- hdu 5461(2015沈阳网赛 简单暴力) Largest Point
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5461 题意就是在数组中找出a*t[i]*t[i]+b*t[j]的最大值,特别注意的是这里i和i不能相等,想 ...
- RDMA的原理、传输与Verbs
RDMA的原理.传输与Verbs RDMA最早专属于infiniband架构.在网络融合的大趋势下出现的RoCE,使高速.超低延时.极低cpu使用率的RDMA得以部署在目前使用最广泛的以太网上. ...
- N! java
import java.util.*; import java.math.*; public class Num2{ public static void main(String args[]){ B ...
- swift 中使用weak self
request.responseString(encoding: NSUTF8StringEncoding) {[weak self] (res) -> Void in if let stron ...
- Spring IOC(七)类型推断
Spring IOC(七)类型推断 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 容器中可以根据 bean ...
- java如何实现发邮件功能。
http://blog.sina.com.cn/s/blog_59ca2c2a01013800.html http://www.cnblogs.com/xdp-gacl/p/4216311.html
- PHP图片处理库Grafika详细教程
转载自51CTO 开发频道 1.图像基本处理:http://developer.51cto.com/art/201611/520928.htm 2.图像特效处理模块:http://developer. ...
- option_match
//与match区别:如果没有匹配到,返回NULLCREATE (olive:Person {name:'Olive Stone'}),(charlie:Person {name:'Charlie S ...
- Axure学习(一)
了解Axure目前的一些评价信息以及可以学习Axure的网址.
- c#使用Stopwatch来计算时间间隔
今天要记录一个接口的耗时情况,就要求去写一段测试各个代码运行时间的方法,于是就加了这么一段代码.原来的做法是在代码执行之前和之后获取系统时间,然后相减.被改成了使用c#里的Stopwatch来计算时间 ...