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,分别表示节点数.初始边数.操作数 ...
随机推荐
- sql建立一种,自定义的执行作业
USE [chongwu] GO /****** Object: StoredProcedure [dbo].[p_createjob] Script Date: 01/21/2016 14:32:0 ...
- 虚拟机安装oracle重新启动后oracle em起不来 ORA-01034: ORACLE not available
(转)http://zhidao.baidu.com/link?url=hM74OA-oWNGGx6RcDaGBwB8Hs0bAnVeKxpC6gpoCGtIGJZ8duYcC-YJ1WNCF7lkP ...
- PAT 1081 检查密码(15) (代码+思路)
1081 检查密码(15 分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也 ...
- iOS最全的常用正则表达式大全
很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下,包括校验数字.字符.一些特殊的需求等等.给自己留个 ...
- Win7下Qt5的安装及使用
1.安装Qt5 Qt5的安装比Qt4的安装简单多了,我装的是Qt5.4(qt-opensource-windows-x86-mingw491_opengl-5.4.0.exe),它集成了MinGW.Q ...
- [Robot Framework] 执行时报 webdriver 异常
在用Robot Framework通过Selenium2Library做web界面自动化测试的时候,报webdriver的错误: 此种情况是因为WebDriver的版本与浏览器的版本不对应. WebD ...
- Linq去重 不用实现IEqualityComparer接口的方法超级简单
RskFactorRelation.Instance.GetCache<RskFactorRelation>(true).Where(x => !string.IsNullOrEmp ...
- contenteditable设置元素可编辑
需求背景 实现一个输入框,高度可以随着输入文字的增加而自动增高 有placeholder,输入为空时,显示placeholder 我们知道可以将div的contenteditable设置伪true,将 ...
- .net利用NPOI生成excel文件
整理代码,这个是生成excel文件,用的是HSSF的方式,只能生成65535行,256列的数据,如果要看office07之后的生成,之前的随笔里提过.这个是一个完整的过程. 首先是已经查找好的数据,这 ...
- PreparedStatement批量处理和事务
PreparedStatement批量处理和事务代码如下: /* * PreparedStatement: 1.addBatch() 将一组参数添加到 PreparedStatement对象内部 2. ...