博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCA-倍增法(在线)O(nlogn)-O(logn)
阅读量:5099 次
发布时间:2019-06-13

本文共 1075 字,大约阅读时间需要 3 分钟。

1. DFS预处理出所有节点的深度和父节点
inline void dfs(int u){    int i;    for(i=head[u];i!=-1;i=next[i])      {          if (!deep[to[i]])        {                        deep[to[i]] = deep[u]+1;            p[to[i]][0] = u; //p[x][0]保存x的父节点为u;            dfs(to[i]);        }    }}

 

2. 初始各个点的2^j祖先是谁 ,其中2^j(j=0...log(该点深度))倍祖先,1倍祖先就是父亲,2倍祖先是父亲的父亲......。

void init(){    int i,j;    //p[i][j]表示i结点的第2^j祖先    for(j=1;(1<
<=n;j++) for(i=1;i<=n;i++) if(p[i][j-1]!=-1) p[i][j]=p[p[i][j-1]][j-1];//i的第2^j祖先就是i的第2^(j-1)祖先的第2^(j-1)祖先}

 

3.从深度大的节点上升至深度小的节点同层,如果此时两节点相同直接返回此节点,即lca。
否则,利用倍增法找到最小深度的
p[a][j]!=p[b][j],此时他们的父亲p[a][0]即lca。
int lca(int a,int b)//最近公共祖先{    int i,j;    if(deep[a]
=0;j--) if(deep[a]-(1<
=deep[b]) a=p[a][j]; if(a==b)return a; //倍增法,每次向上进深度2^j,找到最近公共祖先的子结点 for(j=i;j>=0;j--) { if(p[a][j]!=-1&&p[a][j]!=p[b][j]) { a=p[a][j]; b=p[b][j]; } } return p[a][0];}

 

转载于:https://www.cnblogs.com/OUSUO/p/3805715.html

你可能感兴趣的文章
博客作业2---线性表
查看>>
右击main 方法运行正常,启动tomcat 后,spring boot 项目 出现参数字符串是乱码的情况...
查看>>
javascript朝花夕拾
查看>>
20135335郝爽 & 20135304刘世鹏 实验一
查看>>
多行文本省略号的实现.html
查看>>
写枚举常量
查看>>
[POJ 1004] Financial Management C++解题
查看>>
Oracle基础进阶
查看>>
第一篇随笔, 正在做 ESP32 , STM32 , 树莓派 RaspberryPi 的创客工具
查看>>
电商路演
查看>>
Code Review 转自伯乐在线
查看>>
Pandas plot出图
查看>>
T-SQL 随机返回特定行数据和分页查询
查看>>
SpringBoot2.0之整合Kafka
查看>>
使用 Override 和 New 关键字进行版本控制
查看>>
安装Ubuntu的那些事儿
查看>>
Safari导入书签
查看>>
wordpress如何去掉generator
查看>>
UVA 167 The Sultan's Successors
查看>>
HTMLayout嵌入原则
查看>>