自用lca模板
人丑常数大,总是卡在1000多ms。。。
#include <cstdio>
#include <cstring>
#include <iostream>
#define maxn 5000005
#define jump_max 19
struct Edge{
int from,to;
};
Edge edge[maxn];
int n,m,s,x,y,a,b;
int dep[maxn];
int f[maxn][];
int head[maxn];
int tot = ;
inline void swap_ele(int &a,int &b){
int c = a;
a = b;
b = c;
}
inline int read(){
int num = ;
char c;
bool flag = false;
while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
if (c == '-')
flag = true;
else
num = c - '';
while (isdigit(c = getchar()))
num = num * + c - '';
return (flag ? - : ) * num;
}
void add_edge(int from,int to){
edge[++tot].from = head[from];
edge[tot].to = to;
head[from] = tot;
}
void dfs(int step){
for (int i=head[step];i!=;i = edge[i].from){
int v = edge[i].to;
if (dep[v] == ){
dep[v] = dep[step] + ;
f[v][] = step;
dfs(v);
}
}
}
void init(){ for (register int i=;i<=jump_max;i++)
for (register int j=;j<=n;j++)
f[j][i] = f[ f[j][i-] ][ i- ];
} int lca(int x,int y){
if (dep[x] < dep[y])
swap_ele(x,y);
for (register int i=jump_max;i>=;--i){
if (dep[f[x][i]] >= dep[y])
x = f[x][i];
}
if (x == y)
return y;
for (register int i=jump_max;i>=;--i)
if (f[x][i] != f[y][i]){
x = f[x][i];
y = f[y][i];
} return f[x][];
} int main(){
n = read();m = read();s = read();
for (register int i=;i<=n-;++i){
x = read();y = read();
add_edge(x,y);add_edge(y,x);
}
dep[s] = ;
dfs(s);
init();
for (register int i=;i<=m;++i){
a = read();b = read();
printf("%d\n",lca(a,b));
}
return ;
}
自用lca模板的更多相关文章
- LCA模板
/*********--LCA模板--***************/ //设置好静态参数并构建好图的邻接表,然后调用lca_setquery()设置查询 //最后调用lca_start(),在lca ...
- 倍增求lca模板
倍增求lca模板 https://www.luogu.org/problem/show?pid=3379 #include<cstdio> #include<iostream> ...
- HDU 2586——How far away ?——————【LCA模板题】
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 算法复习——LCA模板(POJ1330)
题目: Description A rooted tree is a well-known data structure in computer science and engineering. An ...
- hdu 2586 How far away?(LCA模板题+离线tarjan算法)
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- LCA模板(数剖实现)
题目链接:https://www.luogu.org/problemnew/show/P3379 题意:LCA模板题. 思路:今天开始学树剖,先拿lca练练.树剖解lca,两次dfs复杂度均为O(n) ...
- POJ 1330 Nearest Common Ancestors(LCA模板)
给定一棵树求任意两个节点的公共祖先 tarjan离线求LCA思想是,先把所有的查询保存起来,然后dfs一遍树的时候在判断.如果当前节点是要求的两个节点当中的一个,那么再判断另外一个是否已经访问过,如果 ...
- HDU2586 How far away ?(LCA模板题)
题目链接:传送门 题意: 给定一棵树,求两个点之间的距离. 分析: LCA 的模板题目 ans = dis[u]+dis[v] - 2*dis[lca(u,v)]; 在线算法:详细解说 传送门 代码例 ...
- 最近公共祖先(LCA)模板
以下转自:https://www.cnblogs.com/JVxie/p/4854719.html 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖 ...
随机推荐
- ehcachexml文件解释
怎么修改默认配置
- phpstudy本地搭建域名访问
http://blog.csdn.net/camillezj/article/details/54694554 步骤如下: 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windo ...
- 求助帖:android开发初期:为什么我在活动二设置的singInstance模式跑到活动三去了???
求android开发的高手帮我看看这个问题吧: <activity android:name=".SecondActivity" android:label="Th ...
- 再叙ASM
上一篇文章,我们已体验到ASM的威力,那么结合上面的代码解释ASM是怎么执行的. ClassWriter clazzWriter = new ClassWriter(0); 首先看下官方文档对Clas ...
- 源码讲解 node+mongodb 建站攻略(一期)第二节
源码讲解 node+mongodb 建站攻略(一期)第二节 上一节,我们完成了模拟数据,这次我们来玩儿真正的数据库,mongodb. 代码http://www.imlwj.com/download/n ...
- 20165206学习基础和C语言基础调查
- 技能 我的一项可以拿的出手的技能是萨克斯.但不敢说有多厉害,更不敢说比大多数人更好,只能说是还可以.我学萨克斯有5年左右的时间吧,这5年里印象最深刻的还是前两年.前两年主要是基础训练.我从最基础的 ...
- ASPNET5 依赖注入(Dependency Injection)
依赖注入一直是asp.net web框架(Web API,SignalR and MVC)中不可或缺的一部分,但是在以前,这个框架都是各自升级,都有各自的依赖注入实现方式,即使Katana项目想通过O ...
- system进程占用80端口
服务器规划:apache分配80,iis分配其他端口 理论上,只需要把iis 默认站点的80端口改成其他端口就可以了,可是发现改了apache80端口还是用不了, cmd查了下,发现system进程占 ...
- linux_samba服务安装
什么是samba服务? 用于Windows和linux系统之间实现共享文件的目的服务 如何配置其服务? Linux端: 搭建服务 1. 安装samba yum install -y samba 2. ...
- scrapy_开发环境
scrapy开发所具备的环境 IDE pycharm 数据库 mysql, redis 开发环境 python 3.5