代码:

//RMQ求LCA
struct node {
int v, w;
};
class LCA {
private:
vector<int>dep, pos, olx, dis;
vector<vector<int>>st;
public:
LCA(vector<vector<node>> &G, int r) {
int sz = G.size();
pos.resize(sz);
dis.resize(sz, );
dep.resize(sz, );
function<void(int, int)>dfs = [&](int u, int fa) {
pos[u] = olx.size();
olx.push_back(u);
dep[u] = dep[fa] + ;
for(auto &i : G[u]) {
if(i.v != fa) {
dis[i.v] = dis[u] + i.w;
dfs(i.v, u);
olx.push_back(u);
}
}
};
dfs(r, r);
int n = olx.size(), m = log2(n) + ;
st.resize(n);
for(int i = ; i < n; i++) {
st[i].resize(m);
st[i][] = olx[i];
}
for(int j = ; j < m; j++) {
for(int i = ; i + ( << j) <= n; i++) {
int x = st[i][j - ], y = st[i + ( << (j - ))][j - ];
st[i][j] = dep[x] < dep[y] ? x : y;
}
}
}
int que(int u, int v) {
int l = pos[u], r = pos[v];
if(l > r) swap(l, r);
int k = log2(r - l + );
int x = st[l][k], y = st[r - ( << k) + ][k];
return dep[x] < dep[y] ? x : y;
}
int dist(int u, int v) {
int lca = que(u, v);
return dis[u] + dis[v] - * dis[lca];
}
}; 倍增求LCA
struct node {
int v, w; };
class LCA {
private:
vector<int>dep;
vector<vector<int>>anc;
vector<int>dis;
public:
LCA(vector<vector<node>> &G, int r) {
int n = G.size(), m = log2(n) + ;
anc.resize(n);
for(auto &i : anc) i.resize(m);
dep.resize(n);
dis.resize(n);
function<void(int, int)>dfs = [&](int u, int fa) {
anc[u][] = fa;
dep[u] = dep[fa] + ;
for(auto &i : G[u]) {
if(i.v != fa) {
dis[i.v] = dis[u] + i.w;
dfs(i.v, u);
}
}
};
dfs(r, r);
for(int j = ; j < m; j++) {
for(int i = ; i < n; i++) {
anc[i][j] = anc[anc[i][j - ]][j - ];
}
}
}
int que(int u, int v) {
if(dep[u] < dep[v]) swap(u, v);
for(int i = log2(dep[u]); i >= ; i--) {
if(dep[u] - ( << i) >= dep[v]) u = anc[u][i];
}
if(u == v) return u;
for(int i = log2(dep[u]); i >= ; i--) {
if(anc[u][i] != anc[v][i]) {
u = anc[u][i];
v = anc[v][i];
}
}
return anc[u][];
}
int dist(int u, int v) {
int lca = que(u, v);
return dep[u] + dep[v] - dep[lca] * ;
}
int kth_anc(int u, int k) { //u节点在k层的祖先
if(dep[u] < k) return -;
int d = dep[u] - k;
for(int i = log2(d); i >= ; i--) {
if(d - ( << i) >= ) {
d -= ( << i);
u = anc[u][i];
}
}
return u;
}
}; tarjan求LCA
struct node {
int v, w;
};
vector<int> LCA(vector<vector<node>> &G, int r, vector<node> &q) {
int n = G.size(), m = q.size();
vector<vector<node>>que(n);
vector<int>bcj(n), ans(m), dis(n);
iota(bcj.begin(), bcj.end(), );
for(int i = ; i < m; i++) {
que[q[i].v].push_back({q[i].w, i});
que[q[i].w].push_back({q[i].v, i});
}
function<int(int)>gr = [&](int k) {
return k == bcj[k] ? k : bcj[k] = gr(bcj[k]);
};
function<void(int, int)>dfs = [&](int u, int fa) {
cout << u << endl;
for(auto &i : G[u]) {
if(i.v != fa) {
dis[i.v] = dis[u] + i.w;
dfs(i.v, u);
bcj[i.v] = u;
}
}
for(auto &i : que[u]) {
if(bcj[i.v] != i.v || i.v == u) {
ans[i.w] = gr(i.v);
}
}
};
dfs(r, r);
return ans;
}

LCA 总结的更多相关文章

  1. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  2. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  3. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  4. [bzoj2588][count on a tree] (主席树+lca)

    Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

  5. [板子]倍增LCA

    倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...

  6. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  7. [bzoj3626][LNOI2014]LCA

    Description 给出一个$n$个节点的有根树(编号为$0$到$n-1$,根节点为$0$). 一个点的深度定义为这个节点到根的距离$+1$. 设$dep[i]$表示点$i$的深度,$lca(i, ...

  8. (RMQ版)LCA注意要点

    inline int lca(int x,int y){ if(x>y) swap(x,y); ]][x]]<h[rmq[log[y-x+]][y-near[y-x+]+]])? rmq[ ...

  9. bzoj3631: [JLOI2014]松鼠的新家(LCA+差分)

    题目大意:一棵树,以一定顺序走完n个点,求每个点经过多少遍 可以树链剖分,也可以直接在树上做差分序列的标记 后者打起来更舒适一点.. 具体实现: 先求x,y的lca,且dep[x]<dep[y] ...

  10. 在线倍增法求LCA专题

    1.cojs 186. [USACO Oct08] 牧场旅行 ★★   输入文件:pwalk.in   输出文件:pwalk.out   简单对比时间限制:1 s   内存限制:128 MB n个被自 ...

随机推荐

  1. 性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控

    一.安装配置InfluxDB InfluxDB是GO语言开发的一个开源分布式时序数据库,非常适合存储指标.事件.分析等数据.有人做过mysql和influxDB对比,存储1000万条数据mysql要7 ...

  2. IOS-问题整理

    安装包相关 安装包无法打开 通用中点击验证应用无反应 卸载-删除证书-重装

  3. Python的一些高级特性

    内容基本上来自于廖雪峰老师的blog相当于自己手打了一遍,加强加强理解吧. http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493 ...

  4. Java IO(1)

    IO这一部分内容还是比较多的,对于基础的枯燥但是又重要的内容还是将它记下来比较好. 关于File类 Ø File类直接继承与Object类,File类描述了文件本身的一些属性,File类用来获取或者处 ...

  5. 身份证验证的js

    function isIdCardNo(num) { num = num.toUpperCase(); //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能 ...

  6. 07 (H5*) js课程第8天 高阶函数、闭包、沙箱

    目录: 1:call和apply方法调用 2:bind方法复制 3:函数中的几个属性值 4:高阶函数,函数作为参数 5:高阶函数,函数作为返回值. 6:   作用域链,作用域,预解析 7:闭包--延长 ...

  7. IDF-CTF-不难不易的js加密 writeup

    题目链接: http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=28 就是这里 → http://ctf.idf.c ...

  8. org.hibernate.id.IdentifierGenerationException: Hibernate异常

    异常信息: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned b ...

  9. 洛谷P5018 对称二叉树——hash

    给一手链接 https://www.luogu.com.cn/problem/P5018 这道题其实就是用hash水过去的,我们维护两个hash 一个是先左子树后右子树的h1 一个是先右子树后左子树的 ...

  10. 《JAVA设计模式》之代理模式(Proxy)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述代理(Proxy)模式的: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结 ...