LCA_Tarjan

参考博客:https://www.cnblogs.com/JVxie/p/4854719.html

LCA的Tarjan写法需要结合并查集

从叶子节点往上并

int Find (int x) {
return x == pre[x] ? x:pre[x] = Find(pre[x]);
}
void dfs(int x,int w,int fa) {
d[x] = w; //点x的深度
//遍历与点x相连的点(除了已经访问过的和其父节点)
for (int i = ; i < v[x].size(); i++) {
if (!vis[v[x][i]] && v[x][i] != fa) {
dfs(v[x][i],w+,x);
pre[v[x][i]] = x;
vis[v[x][i]] = ;
}
}
//访问所有和x有询问关系的e
//如果e被访问过;
   //x,e的最近公共祖先为find(e);
}

LCA_倍增

  参考博客:https://www.cnblogs.com/zhouzhendong/p/7256007.html

  先写暴力写法:当x,y深度不同时先把深的调到和浅的同一深度再一起往前面跳找其最近公共祖先。

void dfs(int f,int u){
fa[u]=f;
d[u]=d[f]+;
for (int i=;i<v[u].size();i++)
if (v[u][i]!=f) dfs(u,v[u][i]);
}
int LCA(int a,int b){
if (d[a]>d[b])
swap(a,b);
while (d[b]>d[a]) b=fa[b];
while (a!=b) a=fa[a],b=fa[b];
return a;
}

  显然,一个一个的跳太慢了,我们可以考虑通过二进制进行优化,也就是倍增。

void dfs(int f,int u) {
fa[u][] = f;
dep[u] = dep[f] + ;
for (int i = ; i <= ; i++) {
fa[u][i] = fa[fa[u][i-]][i-];
//其他操作
}
for (int i = ; i < v[u].size(); i++) {
if (f == v[u][i]) continue;
dfs(u,v[u][i]);
}
}
void lca(int x,int y) {
memset(ans,,sizeof(ans));
if (dep[x] < dep[y]) swap(x,y);
for (int i = ; i >= ; i--)
if (dep[fa[x][i]] >= dep[y]) {
//其他操作
x = fa[x][i];
}
if (x == y) {
return;
}
for (int i = ; i >= ; i--)
if (fa[x][i] != fa[y][i]) {
//其他操作
x = fa[x][i],y = fa[y][i];
}
}

例题:洛谷P3292 [SCOI2016]幸运数字  | 题解

最新文章

  1. java.lang.Class.isPrimitive()用法解析
  2. DSP, SSP, DMP
  3. Oracle客户端配置
  4. js对象使用格式
  5. 20 款超棒免费的 Bootstrap 管理和前端模板
  6. 如果选择构建ui界面方式,手写代码,xib和StoryBoard间的博弈
  7. KNN及其改进算法的python实现
  8. 【HDU3487】【splay分裂合并】Play with Chain
  9. ListView的Item点击事件(消息传递)
  10. 面试题-Java基础-Applet部分
  11. public static void main(string[] args)解释
  12. Postgresql与Oralce常用用法区别总结
  13. 002-J2EE-tomcat的配置
  14. shiro三连斩之第一斩
  15. redis 分布式读写锁
  16. Java_JDBC一般写法
  17. 大数据学习路线:Zookeeper集群管理与选举
  18. Kubernetes简介
  19. 深入理解java虚拟机---内存分配策略(十三)
  20. Mysql #1406 Data too long 错误

热门文章

  1. ubuntu18.04 挂载ntfs硬盘无法写入解决办法
  2. docker 使用总结
  3. java 网络编程Socket
  4. Vue 获取DOM元素ref
  5. 【u228】圣诞树
  6. 2019QLU.ACM集训队暑假训练须知
  7. vue项目多列导入
  8. 性能测试基础-HTTP用例设计
  9. Python涉及的各个领域以及技术应用
  10. 牛客多校第四场sequence C (线段树+单调栈)