【模板】tarjanLCA [2017年6月计划 学习tarjanLCA]
P3379 【模板】最近公共祖先(LCA)
题目描述
如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。
输入输出格式
输入格式:
第一行包含三个正整数N、M、S,分别表示树的结点个数、询问的个数和树根结点的序号。
接下来N-1行每行包含两个正整数x、y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树)。
接下来M行每行包含两个正整数a、b,表示询问a结点和b结点的最近公共祖先。
输出格式:
输出包含M行,每行包含一个正整数,依次为每一个询问的结果。
输入输出样例
- 5 5 4
- 3 1
- 2 4
- 5 1
- 1 4
- 2 4
- 3 2
- 3 5
- 1 2
- 4 5
- 4
- 4
- 1
- 4
- 4
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=10,M<=10
对于70%的数据:N<=10000,M<=10000
对于100%的数据:N<=500000,M<=500000
样例说明:
该树结构如下:
第一次询问:2、4的最近公共祖先,故为4。
第二次询问:3、2的最近公共祖先,故为4。
第三次询问:3、5的最近公共祖先,故为1。
第四次询问:1、2的最近公共祖先,故为4。
第五次询问:4、5的最近公共祖先,故为4。
故输出依次为4、4、1、4、4。
- #include <bits/stdc++.h>
- inline void read(int &x){x = 0;char ch = getchar();char c = ch;while(ch > '9' || ch < '0')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
- inline void read(long long &x){x = 0;char ch = getchar();char c = ch;while(ch > '9' || ch < '0')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
- const int INF = 0x3f3f3f3f;
- const int MAXN = 500000 + 10;
- const int MAXM = 500000 + 10;
- long long n,m,root;
- struct Edge
- {
- int u,v,next;
- }edge[(MAXN << 1) + 10];
- int head[MAXN],cnt;
- inline void insert(int a,int b){edge[++cnt] = Edge{a,b,head[a]};head[a] = cnt;}
- struct qEdge
- {
- int u,v,next,ans;
- }qedge[(MAXM << 1) + 20];
- int qhead[MAXM], qcnt;
- inline void qinsert(int a,int b){qedge[++qcnt] = qEdge{a,b,qhead[a],0};qhead[a] = qcnt;}
- int tmp1,tmp2;
- bool b[MAXN];
- int fa[MAXN];
- //并查集
- int find(int x)
- {
- return x == fa[x] ? fa[x] : fa[x] = find(fa[x]);
- }
- void merge(int a, int b)
- {
- int tmp1 = find(a);int tmp2 = find(b);
- if(tmp1 == tmp2)
- {
- return;
- }
- else
- {
- fa[tmp2] = find(tmp1);
- }
- }
- void dfs(int u)
- {
- for(int pos = head[u];pos;pos = edge[pos].next)
- {
- int v = edge[pos].v;
- if(!b[v])
- {
- b[v] = true;
- dfs(v);
- merge(u, v);//把v指向u合并
- }
- }
- for(int pos = qhead[u];pos;pos = qedge[pos].next)
- {
- int v = qedge[pos].v;
- if(b[v])
- {
- int tmp = find(v);
- qedge[pos].ans = tmp;
- if(pos & 1)
- {
- qedge[pos + 1].ans = tmp;
- }
- else
- {
- qedge[pos - 1].ans = tmp;
- }
- }
- }
- }
- void tarjan()
- {
- for(int i = 1;i <= n;i ++)
- {
- fa[i] = i;
- }
- b[root] = true;
- dfs(root);
- }
- int main()
- {
- read(n);read(m);read(root);
- for(int i = 1;i < n;i ++)
- {
- read(tmp1);read(tmp2);
- insert(tmp1, tmp2);
- insert(tmp2, tmp1);
- }
- for(int i = 1;i <= m;i ++)
- {
- read(tmp1);read(tmp2);
- qinsert(tmp1, tmp2);
- qinsert(tmp2, tmp1);
- }
- tarjan();
- for(int i = 1;i <= m;i ++)
- {
- printf("%d\n", qedge[i * 2].ans);
- }
- return 0;
- }
【模板】tarjanLCA [2017年6月计划 学习tarjanLCA]的更多相关文章
- 【模板】Tarjan缩点,强连通分量 洛谷P2341 [HAOI2006]受欢迎的牛 [2017年6月计划 强连通分量01]
P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的 ...
- 【模板】倍增LCA [2017年5月计划 清北学堂51精英班 Day3]
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- 【模板】KMP [2017年5月计划 清北学堂51精英班Day2]
Day2就搞一个KMP把 马拉车.AC自动机等准备省选的时候再说.. 模板题: 1204 寻找子串位置 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze ...
- 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]
以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...
- 【模板】tyvjP1520 树的直径 [2017年5月计划 清北学堂51精英班Day3]
P1520 树的直径 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结点的距离.每两个相邻的结点的距离为1,即父亲结点与儿 ...
- 2017年7月ROS学习资料小结
<孙子兵法·谋攻篇>:"上兵伐谋,其次伐交,其次伐兵,其下攻城:攻城之法为不得已." 任何发生在自己国土上的战争,即便胜利,也饱含屈辱. ----~~~~----Gaz ...
- RQNOJ PID192 梦幻大PK [2017年6月计划 二分图02]
PID192 / 梦幻大PK ☆ 提交你的代码 查看讨论和题解 你还木有做过哦 我的状态 查看最后一次评测记录 质量 7 题目评价 质量 7 ★★★★★ ★★★★☆ ★★★☆☆ ★★☆ ...
- 【CodeVS】2822 爱在心中 [2017年6月计划 强连通分量03]
2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够 ...
- 洛谷P2912 [USACO08OCT]牧场散步Pasture Walking [2017年7月计划 树上问题 01]
P2912 [USACO08OCT]牧场散步Pasture Walking 题目描述 The N cows (2 <= N <= 1,000) conveniently numbered ...
随机推荐
- vue爬坑之input组件
本篇写给第一次用VUE写输入框组件的朋友们 正常情况我们vue2.0是怎么样取到input框的值的呢? 很简单只需要给input框设置v-model="val" 我们就能从data ...
- 一个事件一定时间内只允许点击执行一次 与 vue阻止滚动穿透
可能我的方法很笨,简单实现来的就是给两个状态,一个状态点击时就发生改变,另外一个给一个定时器延迟改变 篮圈部分,给了两种状态,一个isDisable,一个comeTime 点击事件以后comeTime ...
- LeeCode-Single Number III
Given an array of numbers nums, in which exactly two elements appear only once and all the other ele ...
- springboot 2+ druid
springboot 1+ druid druid 配置 import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid ...
- hammer.js使用
手势包括点击(tap),长按(press),滑动(swipe),方向(pan) 使用实例: <!DOCTYPE html> <html> <head> <me ...
- [欧拉路]CF1152E Neko and Flashback
1152E - Neko and Flashback 题意:对于长为n的序列c和长为n - 1的排列p,我们可以按照如下方法得到长为n - 1的序列a,b,a',b'. ai = min(ci, ci ...
- day48作业
使用Bootstrap框架编写一个简单的web静态页面 效果图: <!DOCTYPE html> <html lang="en"> <head> ...
- jeecms获取绝对路径
jeecms后台管理做一个附件上传到服务器上,然后读取改上传文件,半天获取不到路径,后来发现有定义好的绝对路径获取方法: //最好将文件上传到u文件夹底下 String path="/u/c ...
- 【agc013d】AtCoder Grand Contest 013 D - Piling Up
题意 盒子里有n块砖,每块的颜色可能为蓝色或红色. 执行m次三步操作: 1.从盒子里随便拿走一块砖 2.放入一块蓝砖和红砖到盒子里 3.从盒子里随便拿走一块砖 给定n,m 问拿出来的砖,可能有多少种不 ...
- DAO设计模式总结
1.DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作. 数据开发结构流程: 资源层是数据库的操作层,里面可以进行各种 ...