LCA 总结
代码:
//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 总结的更多相关文章
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- [bzoj2588][count on a tree] (主席树+lca)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- [板子]倍增LCA
倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- [bzoj3626][LNOI2014]LCA
Description 给出一个$n$个节点的有根树(编号为$0$到$n-1$,根节点为$0$). 一个点的深度定义为这个节点到根的距离$+1$. 设$dep[i]$表示点$i$的深度,$lca(i, ...
- (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[ ...
- bzoj3631: [JLOI2014]松鼠的新家(LCA+差分)
题目大意:一棵树,以一定顺序走完n个点,求每个点经过多少遍 可以树链剖分,也可以直接在树上做差分序列的标记 后者打起来更舒适一点.. 具体实现: 先求x,y的lca,且dep[x]<dep[y] ...
- 在线倍增法求LCA专题
1.cojs 186. [USACO Oct08] 牧场旅行 ★★ 输入文件:pwalk.in 输出文件:pwalk.out 简单对比时间限制:1 s 内存限制:128 MB n个被自 ...
随机推荐
- 【BASIS系列】SAP 设置系统timeout时间
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP 设置系统timeout ...
- Google File System 论文阅读笔记
核心目标:Google File System是一个面向密集应用的,可伸缩的大规模分布式文件系统.GFS运行在廉价的设备上,提供给了灾难冗余的能力,为大量客户机提供了高性能的服务. 1.一系列前提 G ...
- Java实现红黑树
转自:http://www.cnblogs.com/skywang12345/p/3624343.html 红黑树的介绍 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉 ...
- 爬取王垠的博客并生成pdf
尚未完善,有待改进 #!/usr/bin/env python3 # -*- coding: utf-8 -*- __author__ = 'jiangwenwen' import pdfkit im ...
- [Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列)
[Codeforces712D] Memory and Scores(DP+前缀和优化)(不用单调队列) 题面 两个人玩游戏,共进行t轮,每人每轮从[-k,k]中选出一个数字,将其加到自己的总分中.已 ...
- CSS-06 外部JS,CSS文件的寻址问题
如果js.css外部文件有使用到相对路径,其相对路径的基准是不一样的 当一个index.html中引入外部的JS和CSS文件时: 在index.css文件中,相对路径的写法是以css文件相对于img图 ...
- 关于linux的日志
日志的三种类型# 内核及系统日志: 这种日志数据由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消息及各种系统程序消息记录到什么位置.系统中有相当 ...
- jquery 小知识
$("p:eq(0)") :表p标签的第一个元素 $("p:eq(1)") :表p标签的第二个元素
- Exception和Error区别
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11393728.html Exception和Error都是继承了Throwable类,在Java中只有 ...
- 多线程模拟生产者消费者示例之Lock
public class Test { public static void main(String[] args) { List<String> list = new ArrayList ...