不会 准备研究一波!!!

 #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最近公共祖先的更多相关文章

  1. lca 最近公共祖先

    http://poj.org/problem?id=1330 #include<cstdio> #include<cstring> #include<algorithm& ...

  2. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载)

    Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)(转载) 转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2 ...

  3. LCA(最近公共祖先)模板

    Tarjan版本 /* gyt Live up to every day */ #pragma comment(linker,"/STACK:1024000000,1024000000&qu ...

  4. CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )

    CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...

  5. LCA近期公共祖先

    LCA近期公共祖先 该分析转之:http://kmplayer.iteye.com/blog/604518 1,并查集+dfs 对整个树进行深度优先遍历.并在遍历的过程中不断地把一些眼下可能查询到的而 ...

  6. LCA 近期公共祖先 小结

    LCA 近期公共祖先 小结 以poj 1330为例.对LCA的3种经常使用的算法进行介绍,分别为 1. 离线tarjan 2. 基于倍增法的LCA 3. 基于RMQ的LCA 1. 离线tarjan / ...

  7. LCA最近公共祖先 ST+RMQ在线算法

    对于一类题目,是一棵树或者森林,有多次查询,求2点间的距离,可以用LCA来解决.     这一类的问题有2中解决方法.第一种就是tarjan的离线算法,还有一中是基于ST算法的在线算法.复杂度都是O( ...

  8. Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)【转】【修改】

    一.基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成 ...

  9. (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)

    基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...

  10. LCA 最近公共祖先 tarjan离线 总结 结合3个例题

    在网上找了一些对tarjan算法解释较好的文章 并加入了自己的理解 LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点.也就是说,在两个点通 ...

随机推荐

  1. Android 入门(2)修改EditText下划线颜色 / 隐藏标题栏

    1 添加颜色 colors.xml中增加 <color name="colorRed">#FF3300</color> 2 添加style styles.x ...

  2. Mdoelsim10.4怎么脚本单独仿真ISE14.7 IP核

    软件版本: Modelsim10.4SE ISE14.7 仿真IP:时钟管理IP(clock wizard)   流程: 1.对于Modelsim10.4SE,并不自带Xilinx家的仿真库,因此首先 ...

  3. Linux-安装Windows字体

    Linux 服务器安装Windows字体 直接上步骤: Windows字体包下载链接:https://pan.baidu.com/s/1ks9a70snHo02CTuqTrQhhg  提取码:7aw5 ...

  4. Java Web项目中解决中文乱码方法总结

    一.了解常识: 1.UTF-8国际编码,GBK中文编码.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.web tomcat:默认是ISO8859-1,不 ...

  5. node.js的基础知识

    第一部分知识: .命令行窗口(小黑屏).CMD窗口.终端.shell - 开始菜单 --> 运行 --> CMD --> 回车 - 常用的指令: dir 列出当前目录下的所有文件 c ...

  6. utf8mb4的大小写敏感性测试及其修改方法

    utf8mb4的大小写敏感性测试及其修改方法 utf8mb4_ unicode_ ci 与 utf8mb4_ general_ ci 如何选择字符除了需要存储,还需要排序或比较大小,涉及到与编码字符集 ...

  7. prometheus 标签使用

    标签的配置使用 考虑到要明智地使用标签,我们需要给事物重新命名.在一个集中的.复杂的监视环境中,我们有时无法控制正在监视的所有资源以及它们公开的监视数据.重新标记允许在自己的环境中控制.管理和潜在地标 ...

  8. java调用matlab绘图

    一 注意事项 1: MatLab的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder). 2: 运 ...

  9. win7 远程连接服务器出现身份验证错误,又找不到加密Oracle修正

    今天想用远程桌面连接登录服务器,结果,弹出一个错误的提示框:发生身份验证错误,要求的函数不受支持. 然后在网上找了相关的教程,基本上所有的方法都是如下所示: 策略路径:"计算机配置" ...

  10. redis远程连接报错记录

    错误如下 redis可视化工具连接测试 telnet ip 6379 修改关键参数如下 #开通外网访问 # bind 127.0.0.1 #以后台方式运行 daemonize no #取消保护模式,保 ...