LCA最近公共祖先
不会 准备研究一波!!!
#include<bits/stdc++.h>
const int maxn = ;
using namespace std;
vector<int> g[maxn];
int par[][maxn], dep[maxn], n, m, ml;
void dfs(int v, int p, int d)
{
par[][v] = p;
dep[v] = d;
for (int i = ; i < g[v].size(); ++i){
if (g[v][i] != p) dfs(g[v][i], v, d + );
}
return ;
}
void init(int v)
{
dfs(v, -, );
int sum = ;
while (sum <= n) sum <<= , ++ml;
for (int k = ; k < ml; ++k){
for (int v = ; v <= n; ++v){
if (par[k][v] == -) par[k + ][v] = -;
else par[k + ][v] = par[k][par[k][v]];
}
}
return ;
}
int lca(int u, int v)
{
if (dep[u] > dep[v]) swap(u, v);
for (int k = ; k < ml; ++k){
if (((dep[v] - dep[u]) >> k) & ) v = par[k][v];
}
if (u == v) return u;
for (int k = ml; k >= ; --k){
if (par[k][u] != par[k][v]) u = par[k][u], v = par[k][v];
}
return par[][u];
}
int main()
{
int s, u, v;
scanf("%d %d %d", &n, &m, &s);
int t = n;
while (--t){
scanf("%d %d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
init(s);
while (m--){
scanf("%d %d", &u, &v);
printf("%d\n", lca(u, v));
}
return ;
}
题目 https://www.luogu.org/problemnew/show/P3379
自己写的一个倍增LCA
#include<iostream>
#include<cstring>
//#include<bits/stdc++.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstdio>
#include<map>
#include<set>
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sii(a,b) scanf("%d%d",&a,&b)
#define sll(a,b) scanf("%lld%lld",&a,&b)
#define queues priority_queue
#define mod 998244353
#define mem(a) memset(a,0,sizeof(a));
#define def(a) ((a)&(-a))
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
//priority_queue<int,vector<int >,greater<int > >q;
const ll INF=0x3f3f3f3f;
//const double E=exp(1);
//const double PI=acos(-1);
using namespace std;
int de[];
int lg[];
int f[][];
vector<int>ss[];
void get_lg()
{lg[]=-;
for(int i=;i<=;i++)
lg[i]=lg[i>>]+;
}
void dfs(int p,int fa)
{ de[p]=de[fa]+;
f[p][]=fa;
for(int i=;i<=lg[de[p]]+;i++)
f[p][i]=f[f[p][i-]][i-];
for(int i=;i<ss[p].size();i++)
{ int x=ss[p][i];
if(x!=fa)
{
dfs(x,p);
}
}
}
int LCA(int a,int b)
{ if(de[a]<de[b])swap(a,b);
while(de[a]!=de[b])
{
a=f[a][lg[de[a]-de[b]]];
}
if(a==b)return a;
for(int i=lg[de[a]];i>=;i--)
{
if(f[a][i]!=f[b][i])
a=f[a][i],b=f[b][i];
}
return f[a][];
}
int main()
{ ios::sync_with_stdio(false);
int n,m,s;
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
ss[a].pb(b);
ss[b].pb(a);
}
get_lg();
dfs(s,);
for(int i=;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",LCA(a,b));
// cout<<LCA(a,b)<<endl;
}
}
又有一个树链剖分求LCA
#include<bits/stdc++.h>
typedef long long ll;
const int maxn=+;
const int INF=0x3f3f3f3f;
using namespace std;
const ll MAX=
int read(){int x=,f=;char s=getchar();for(; s>''||s<''; s=getchar()) if(s=='-') f=-;for(; s>=''&&s<=''; s=getchar()) x=x*+s-'';return x*f;}
vector<int>q[maxn];
int f[maxn];
int d[maxn];
int siz[maxn];
int son[maxn]; int top[maxn];
int id[maxn];
int rk[maxn];
int dfs(int a,int fa)
{
f[a]=fa;
d[a]=d[fa]+;
siz[a]=;
for(int i=; i<q[a].size(); i++)
{
int z=q[a][i];
if(z!=fa)
{
dfs(z,a);
siz[a]+=siz[z];
if(!son[a]||siz[z]>siz[son[a]])
son[a]=z;
}
}
return ;
}
int sum;
void dfs1(int a,int b)
{
top[a]=b;
if(!son[a])
return ;
dfs1(son[a],b);
for(int i=; i<q[a].size(); i++)
{
int z=q[a][i];
if(z!=f[a]&&z!=son[a])
dfs1(z,z);
}
}
int lca(int a,int b)
{
while(top[a]!=top[b])
{
d[top[a]]>d[top[b]]?a=f[top[a]]:b=f[top[b]]; }
return d[a]<d[b]?a:b;
}
int main()
{
ios::sync_with_stdio(false);
int n,m,s;
n=read();m=read();s=read();
for(int i=; i<n; i++)
{
int a,b;
a=read();
b=read();
q[a].pb(b);
q[b].pb(a);
}
dfs(s,);
dfs1(s,s);
while(m--)
{
int a,b;
a=read();
b=read();
cout<<lca(a,b)<<endl;
}
}
LCA最近公共祖先的更多相关文章
- lca 最近公共祖先
http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm& ...
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)
Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...
- LCA(最近公共祖先)模板
Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...
- LCA近期公共祖先
LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...
- LCA 近期公共祖先 小结
LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...
- LCA最近公共祖先 ST+RMQ在线算法
对于一类题目,是一棵树或者森林,有多次查询,求2点间的距离,可以用LCA来解决. 这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O( ...
- Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】
一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...
- (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
- LCA 最近公共祖先 tarjan离线 总结 结合3个例题
在网上找了一些对tarjan算法解释较好的文章 并加入了自己的理解 LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点.也就是说,在两个点通 ...
随机推荐
- jzoj6099. 【GDOI2019模拟2019.4.1】Dist
题目链接:https://jzoj.net/senior/#main/show/6099 考虑直接统计某个点到其它所有点的距离和 我们先把整个团当成一个点建图,处理出任意两个团之间的距离\(dis(i ...
- 帝国cms 不能正常显示最新文章
后台能正常刷新,但前台就是不能正常显示, 把网站从c盘换到d盘,好了,原来是权限的问题
- 【转】 如何重写hashCode()和equals()方法
转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...
- pta寒假作业3
题目三:捉老鼠啊,亏了还是赚了 实验代码 #include <stdio.h> #include <stdlib.h> int main(void) { ...
- Linux查看系统信息的命令及已安装软件包的命令
系统 uname -a查看内核/操作系统/CPU信息head -n 1 /etc/issue查看操作系统版本cat /proc/cpuinfo查看CPU信息hostname查看计算机名lspci -t ...
- 五十二、linux 编程——网络介绍
52.1 网络介绍 使用远程资源 共享信息.程序和数据 分布处理 52.1.1 协议的概念 计算机网络中实现通信必须有一些约定,如对速率.传输代码.代码结构.传输控制步骤和出错控制等约定,这些约定即被 ...
- idea远程tomcat运行项目
记录一下idea远程tomcat运行项目的配置过程 背景:每次系统修改代码后则需手动打包手动部署到测试服务器上,为了简化这个过程我这里选择尝试一次idea的远程运行功能,结论来讲这玩意配置麻烦,并不算 ...
- python3 使用pip安装(命令行中)失败或 “not a supported wheel” 解决方案!
原因1: 安装的不是对应python版本的库,下载的库名中cp36代表python3.6,其它同理. 原因2:(我遇到的情况----下载的是对应版本的库,然后仍然提示不支持当前平台) 百度了一下,说法 ...
- Selective Search for Object Recognition(理解)
0 - 背景 在目标检测任务中,我们希望输入一副图像,输出目标所在的位置以及目标的类别.最常用的算法是滑动窗口方法,但滑动窗口其实相当于穷举图像中的所有子图像,其效率低且精度也受限.该论文提出一种新的 ...
- Stack的相关API
public class Stack<E> extends Vector<E> : Stack类代表后进先出(LIFO)堆栈的对象. 它扩展了类别Vector与五个操作,允许一 ...