倍增求LCA
时间:2019-09-03
本文章向大家介绍倍增求LCA,主要包括倍增求LCA使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#include<bits/stdc++.h>
struct node
{
int from,to,next;
}edge[1000001];
int n,m,s,head[1000001],num,depth[1000001],father[1000001][50];
void add(int u,int v)
{
edge[++num].from=u;
edge[num].to=v;
edge[num].next=head[u];
head[u]=num;
return;
}
void Depth_First_Search(int now,int dep,int last)
{
for(int i=head[now];i;i=edge[i].next)
if(edge[i].to-last)
{
depth[edge[i].to]=dep+1;
father[edge[i].to][0]=now;
for(int j=1;(1<<j)<=depth[edge[i].to];j++)
father[edge[i].to][j]=father[father[edge[i].to][j-1]][j-1];
Depth_First_Search(edge[i].to,dep+1,now);
}
return;
}
int lca(int x,int y)
{
if(depth[x]<depth[y])
x^=y^=x^=y;
while(depth[x]>depth[y])
x=father[x][int(log2(depth[x]-depth[y]))];
if(x==y)
return x;
for(int i=log2(depth[x]);i>=0;i--)
if(father[x][i]-father[y][i])
{
x=father[x][i];
y=father[y][i];
}
return father[x][0];
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
Depth_First_Search(s,0,0);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}
原文地址:https://www.cnblogs.com/s-t-a-r-d-u-s-t/p/11455249.html
- [喵咪BELK实战(2)] elasticsearch+kibana搭建
- 【第二期】一次学透java.io
- [喵咪BELK实战(1)]浅谈日志的重要性以及介绍BELK
- Unicode编解码函数
- 适配器模式
- [PhalApi实战篇(1)]Redis队列处理异步任务
- 修饰者模式
- PhalApi-RabbitMQ基于PhalApi专业队列拓展
- Python的三个问题
- [喵咪开源软件推荐(4)]Liunx跑分神器-unixbench
- 正则化贪心森林(RGF)的入门简介,含案例研究
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(二)之分库分表路由
- [喵咪开源软件推荐(3)]全球IP库-GeoLite2-City
- [喵咪MQ(3)]RabbitMQ集群安装配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RoarCTF2019-EasyJava
- ACTF2020新生赛-BackupFile
- DB2 Linux平台安装 Part 5 数据库常见参数配置
- GXYCTF2019-PingPingPing
- 利用cloudflareWorkers制作Google镜像站
- MySQL information_schema详解 COLLATIONS
- 极客大挑战2019-Knife
- DB2备份还原相关操作
- MySQL复制全解析 Part 8 MySQL Auto-Positioning
- Redis 5.0.8 主从搭建
- Linux 修改网卡名称及mac地址
- MySQL Galera Cluster全解析 Part 10 grastate.dat文件详解
- MySQL MHA部署 Part 7 MHA手动切换测试
- 使用sysbench进行压测 Part2 sysbench语法介绍
- mysqlbinlog命令详解 Part 1-实验环境准备