LCA Tarjan
初二学完忘了QAQ,今天再学一发
原题Link:https://www.luogu.org/problem/show?pid=3379
Code:
1 #include <iostream> 2 #include <cstdio> 3 const int maxn=500000*2+100; 4 int n,m,i,to[maxn],root,x,y,last[maxn],next[maxn],next1[maxn],last1[maxn],to1[maxn],ans[maxn],fa[maxn],v[maxn]; 5 using namespace std; 6 inline void read(int &k) 7 { 8 int f=1;char c=getchar();k=0; 9 while (c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 10 while (c>='0'&&c<='9')k=k*10+c-'0',c=getchar(); 11 k*=f; 12 } 13 inline int gf(int now) 14 { 15 return fa[now]==now?now:fa[now]=gf(fa[now]); 16 } 17 inline void dfs(int now) 18 { 19 v[now]=1; 20 for(int cur=last[now];cur;cur=next[cur]) 21 { 22 if (!v[to[cur]]) 23 { 24 dfs(to[cur]); 25 fa[to[cur]]=now; 26 } 27 } 28 for (int cur=last1[now];cur;cur=next1[cur]) 29 if (v[to1[cur]])ans[(cur+1)>>1]=gf(to1[cur]); 30 } 31 int main() 32 { 33 read(n);read(m);read(root); 34 for (i=1;i<n;i++) 35 { 36 read(x);read(y); 37 to[i*2-1]=y; 38 next[i*2-1]=last[x]; 39 last[x]=i*2-1; 40 to[i*2]=x; 41 next[i*2]=last[y]; 42 last[y]=i*2; 43 } 44 for (i=1;i<=m;i++) 45 { 46 read(x);read(y); 47 to1[i*2-1]=y; 48 next1[i*2-1]=last1[x]; 49 last1[x]=i*2-1; 50 to1[i*2]=x; 51 next1[i*2]=last1[y]; 52 last1[y]=i*2; 53 } 54 for (i=1;i<=n;i++)fa[i]=i; 55 dfs(root); 56 for (i=1;i<=m;i++) 57 printf("%d\n",ans[i]); 58 }
View Code
转载于:https://www.cnblogs.com/mczhuang/p/7339987.html
LCA Tarjan相关推荐
- 最近公共祖先 LCA Tarjan算法
来自:http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个 ...
- hdu 4547(LCA+Tarjan)
解题思路:很明显的LCA问题,用Tarjan离线算法即可.这里输入的可能是字符串,所以直接用map保存.此外,根据题意,这里需要稍稍有点变化,因为cd:a\b\c...这里是一步即可完成,所以在查询a ...
- 洛谷 - P3379 【模板】最近公共祖先(LCA)(RMQ求LCA/Tarjan求LCA)
题目链接:点击查看 题目大意:给出一棵 n 个点组成的有根树,再给出 m 次询问,每次询问需要回答点 x 和点 y 的 lca 题目分析:今天新学了两种蛮有意思的求 LCA 的方法,总结一下四种方法各 ...
- 最近公共祖先(LCA,Tarjan)
一定要耐心慢慢看 Tarjan算法的优点在于相对稳定,时间复杂度也比较居中,也很容易理解. 下面详细介绍一下Tarjan算法的基本思路: 1.任选一个点为根节点,从根节点开始. 2.遍历该点u所有子节 ...
- LCA 朴素算法+树差分倍增+Tarjan算法 三种算法实现c++代码实现
哔哩哔哩up视频:https://www.bilibili.com/video/BV1nE411L7rz?t=379 转载:http 文章目录 树差分 & 倍增LCA Tarjan 朴素算法 ...
- 数据结构课程设计-神秘国度的爱情故事-LCA:tarjan+离线/树链剖分/暴力
1.无脑暴力dfs: O(n*m) 2.LCA/tarjan+离线处理: O(n+m) 3.LCA/树链剖分: O(nlogn+m)~O(nlogn+mlogn) 4.LCA/倍增思想(有空再补) ...
- Tarjan算法_LCA
参考资料:Tarjan算法_LCA tarjan算法求LCA Tarjan 算法&模板 只是对其中的代码进行一下注释,如有错误还得回来再改. //不怕别人比你聪明,就怕别人比你聪明还比你努 ...
- 斯大林格勒拖拉机厂LCA项目研制成功
什么是LCA? 话不多说,同志们先来康康LCA是什么东西.(逃 LCA"光辉"是印度斯坦航空公司(HAL)为满足印度空军需要研制的单座单发轻型全天候超音速战斗攻击机,主要任务是争夺 ...
- 「LuoguP3379」 【模板】最近公共祖先(LCA)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- 图论--最近公共祖先LCA
最近公共祖先LCA LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先) 最近公 ...
最新文章
- 在 ASP.NET 网页中不经过回发而实现客户端回调
- python使用退格键时出现^H解决方法
- WINCE6.0 error C2220: warning treated as error问题解决
- easyui打开新的选项卡_Easyui Tabs 标签页/选项卡_EasyUI 插件
- OpenGL实现3D立体显示
- 法流程图_世界五大学习方法之西蒙学习法
- QT不让windows休眠的方法
- Tomcat详解(二)——tomcat安装与配置
- 077 logging模块
- Atitit 怎么阅读一本书 消化 分析 检索 attilax总结 1. 读书的本质 是数据的处理,大量的数据,处理能力有限的大脑	2 2. ETL数据清洗转换 摘要,缩小数据规模	2 2.1
- OpenCV实现监控移动侦测
- JAVA山地车deca_越野怪兽 JAVA摆渡人 (ANIMA)山地车
- android手机设置固定dns,手机怎么设置dns 手机设置dns方法【详解】
- 计算机电源认证,80plus认证级别含义扫盲
- Cocos2d-x-3c 设计之路 CocosBase CocosNet CocosWidget
- Vue Element 使用required提示语问题 出现‘xxx is required‘解决方案
- python 笛卡尔积 两个表_多个集合计算笛卡尔积-Python
- WMLS10自动建立BIN位(模板配置)
- win10下完美卸载ubuntu
- Mac环境下安装MongoDB数据库
热门文章
- 新出炉的面试题,了解一下?
- mysql 语法手册_MySQL语法大全_自己整理的学习笔记
- win10无法装载重装系统iso文件_华硕笔记本怎么自己重装系统|华硕笔记本自己装系统教程...
- python检测excel是否打开_Python: 如何判断远程服务器上Excel文件是否被人打开
- 你还在生产环境改代码么?函数计算版本管理(三)使用别名进行灰度发布...
- 注意!思科Aironet 1830和1850系列存在硬编码密码,请尽快修复!
- [.NET] 《Effective C#》快速笔记(四)- 使用框架
- Ubuntu 12 修改环境变量
- JavaScript判断浏览器类型及版本(新增IE11)
- 原创Android开发文章集合贴