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),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点.也就是说,在两个点通 ...
随机推荐
- <数据结构基础学习>(二)简单的时间复杂度分析
一.简单的复杂度分析 O(1) O(n) O(logn) O(logn) O(n^2) 大O描述的是算法的运行事件和输入数据之间的关系 Eg: 数组求和 public static int sum(i ...
- apache beam ElasticSearchIO 遇到异常后job中断执行 自己定制beam IO
可以将 ElasticSearchIO.java 源码拷贝至自己的项目.改名为MyElasticSearchIO.java.自己定制实现.这时编译会遇到auto.value失败.在pom.xml中加入 ...
- 自古枪兵幸运E
好梗 求方程的解.n个可以奇数可以偶数,m个必须是偶数 两种方法: 都是O(nlogn)logn是LUCAS定理 法一: 有奇数有偶数,如果都是偶数,那么可以直接除以二然后组合数学 所以枚举有几个奇数 ...
- BZOJ3864: Hero meet devil(dp套dp)
Time Limit: 8 Sec Memory Limit: 128 MBSubmit: 397 Solved: 206[Submit][Status][Discuss] Description ...
- server被强制关闭,
一个client和一个Server,两者之间建立了一个基于TCP的socket连接,在刚刚建立好连接后,尚未进行数据传输,Server端应用程序突然crush掉了,现在立刻重启Server端应用程序( ...
- pandas常用函数之shift
shift函数是对数据进行移动的操作,假如现在有一个DataFrame数据df,如下所示: index value1 A 0 B 1 C 2 D 3 那么如果执行以下代码: df.shift() 就会 ...
- linux下安装与配置Redis
1.安装 (1)获取源代码 wget http://download.redis.io/releases/redis-4.0.8.tar.gz (2)解压 tar xzvf redis-4.0.8.t ...
- Quartz C#使用
参考:https://www.cnblogs.com/lazyInsects/p/8075487.htmlQuartz是一款比较好用的定时任务执行工具类,虽然我们平时也可以自己写代码实现定时执行,但是 ...
- [再寄小读者之数学篇](2014-11-02 Herglotz' trick)
设 $f$ 是 $\bbR$ 上周期为 $1$ 的连续可微函数, 满足 $$\bee\label{141102_f} f(x)+f\sex{x+\frac{1}{2}}=f(2x),\quad\for ...
- [译]Ocelot - Big Picture
原文 目录 Big Picture Getting Started Configuration Routing Request Aggregation Service Discovery Authen ...