秘籍之树上蹦迪--LCA
炒鸡炒鸡炒鸡经典的模板题!
直接上代码啦
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <ctime> #define maxn 500000 using namespace std;int n,m,s,u,v,num; int fir[maxn*2],d[maxn*2],p[maxn*2][21];struct qwq {int to;int next; }e[maxn*4];int read() {int x=0;char ch=' ';while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x; }void addedge(int u,int v) {num++;e[num].to=v;e[num].next=fir[u];fir[u]=num; }void dfs(int u,int fa) {d[u]=d[fa]+1;p[u][0]=fa;for(int i=1;(1<<i)<=d[u];i++){p[u][i]=p[p[u][i-1]][i-1];}for(int i=fir[u];i;i=e[i].next){if(e[i].to!=fa) dfs(e[i].to,u);} }int lca(int u,int v) {if(d[u]>d[v]) swap(u,v);for(int i=20;i>=0;--i){if(d[u]<=d[v]-(1<<i)) v=p[v][i];}if(u==v) return u;for(int i=20;i>=0;--i){if(p[u][i]==p[v][i])continue;u=p[u][i];v=p[v][i];}return p[u][0]; }int main() {n=read();m=read();s=read();for(int i=1;i<n;++i){u=read();v=read();addedge(u,v);addedge(v,u);}dfs(s,0);for(int i=1;i<=m;++i){u=read();v=read();printf("%d\n",lca(u,v));}return 0; }
稍微有点疑惑的是为什么节点上跳2^i时不用重新遍历新节点上移2^i,因为2^(i-1)+2^(i-1)=2^i啦,树的深度一般一般一般不会超过2^20啦
转载于:https://www.cnblogs.com/pumpkin-qwq/p/9551340.html
秘籍之树上蹦迪--LCA相关推荐
- Distance on the tree(树上倍增+主席树+树上差分+lca)南昌网络赛
题目链接:南昌邀请赛网络赛Distance on the tree 统计一条链上边权小于k的边数. 树上差分,对于边权来说,一条链上的边的条数=sum[x]+sum[y]-2*sum[lca(x,y) ...
- 洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树上倍增 LCA)
[AHOI2008]紧急集合 / 聚会 题目描述 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有 n n n 个等待点,有 n − 1 n-1 n−1 条道路连接着它们 ...
- BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MB Submit: 1388 Solved: 860 [Submit][Stat ...
- P3128-最大流Max Flow【树上差分,LCA】
正题 题目大意 一棵树 若干条路径,哪个点经过的路径最多,求路径条数. 解题思路 对于每条路径计算一次LCALCALCA,然后树上差分就好了. codecodecode #include<cst ...
- P1967,ssl2267-货车运输【树上倍增LCA,最小生成树变形kruskal】
正题 题目链接: https://www.luogu.org/problemnew/show/P1967 大意 一个无向图,每个边有个权值,若干个询问,求两个点之间的一条最短路是这条最短路上的最小权值 ...
- P2680 运输计划(树上差分+lca+二分)
题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...
- 【2022寒假基础集训】第二场 - G.小沙的身法【树上差分+LCA】
Date:2022.04.28 题目描述 小沙发现他打球打不赢别人,打架也打不赢别人,所以他去了少林寺学习身法,以求打球的时候可以跑的更快,打架的时候也可以跑的更快(bushi). 少林寺的方丈告诉小 ...
- 树上倍增法求最近公共祖先LCA
LCA,最近公共祖先,这个东西有很多作用,因此,如何高效求出LCA就成了一个热点的讨论话题. 下面所有的讨论都以图中这棵树为例子. 先来了解下什么是倍增吧,倍增其实就是二分的逆向,二分是逐渐缩小范围, ...
- 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习
LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...
- PAT (Advanced Level) 1140~1143:1140模拟 1141模拟 1142暴力 1143 BST+LCA
1140 Look-and-say Sequence(20 分) 题意:观察序列D, D1, D111, D113, D11231, D112213111, ...,显然后一个串是对前一个串每一小段连 ...
最新文章
- FireFox 开始放弃 Flash:停止部分内容支持
- HTML、CSS、JS都有哪些区别
- 不使用 Maven 等构建工具,而使用原始方法在 IntelliJ IDEA 中整合 Tomcat 部署 Web 应用
- centos7 校正linux系统时间_基于centos7系统部署NTP服务及配置时间定时同步
- 隐藏UITableView当没有数据或数据不够的时候出现的分割线.
- C++小型公司管理系统
- C4996	'sprintf': This function or variable may be unsafe.
- 微信私人心情录小程序源码
- 数字图像处理_冈萨雷斯
- 一套基于java的开源车牌识别算法
- 企业管理系统各主要模块简介
- QAndroidJniObject::callStaticObjectMethod参数含义
- Faceboxes pytorch代码解读(一) box_utils.py(上篇)
- 英语从句(英语兔学习笔记)
- 主成分分析 (PCA) 和独立成分分析 (ICA)附Matlab代码
- 一元试用虚拟服务器,一元试用云服务器
- 官宣:传智播客品牌全新升级为「传智教育」
- 抖音短视频审核流程梳理
- iOS UIWebView 缩放
- photoshop学习笔记(二)---PS的相关工具
热门文章
- Android-多线程AsyncTask
- WPF 创建右键菜单
- 如何在XML序列化时隐藏可为null的的字段(XmlElement和XmlAttribute)
- 七种qsort排序方法
- 会声会影2018,带你体验不一样的光影世界!
- 报错:The following signatures couldn‘t be verified because the public key is not available: NO_PUBKEY
- 【Flutter】Dart中的var、final 和 const基本使用
- iOS底层探索之多线程(五)—GCD不同队列源码分析
- 云计算介绍、TCP/IP协议及配置
- 对vue饿了么项目重构之后的一些理解