博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2586 How far away ? 倍增求LCA
阅读量:4966 次
发布时间:2019-06-12

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

倍增求LCA

LCA函数返回(u,v)两点的最近公共祖先

#include 
using namespace std;const int N = 40010*2;struct node { int v,val,next; node(){} node(int vv,int va,int nn):v(vv),val(va),next(nn){}}E[N];int n,m;int tot,head[N],dis[N],f[N][20],dep[N];void init() { tot = 0; memset(head,0,sizeof(head)); memset(dis,0,sizeof(dis)); memset(f,0,sizeof(f)); memset(dep,0,sizeof(dep));}void add(int u,int v,int val) { E[++tot].next = head[u]; E[tot].v = v; E[tot].val = val; head[u] = tot;}void addEdge(int u,int v,int val) { add(u,v,val); add(v,u,val);}void dfs(int x,int fa) { f[x][0] = fa; for(int i=1;f[x][i-1];i++) f[x][i] = f[f[x][i-1]][i-1]; for(int i=head[x]; i; i=E[i].next) { int v = E[i].v; if(v != fa) { dis[v] = dis[x] + E[i].val; dep[v] = dep[x] + 1; dfs(v,x); } }}int lca(int u,int v) { if(dep[u] < dep[v]) swap(u,v); //int ans = dep[u] - dep[v]; for(int i=19;i>=0;i--) if(dep[u]-(1<
=dep[v]) u = f[u][i]; for(int i=19;i>=0;i--) { if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];//ans+=(2<

 

转载于:https://www.cnblogs.com/Draymonder/p/9617303.html

你可能感兴趣的文章
dashucoding记录2019.6.7
查看>>
IOS FMDB
查看>>
编码总结,以及对BOM的理解
查看>>
九涯的第一次
查看>>
Android中全屏或者取消标题栏
查看>>
处理器管理与进程调度
查看>>
页面懒加载
查看>>
向量非零元素个数_向量范数详解+代码实现
查看>>
java zip 中文文件名乱码_java使用zip压缩中文文件名乱码的解决办法
查看>>
java if 用法详解_Java编程中的条件判断之if语句的用法详解
查看>>
kafka的java客户端_KAFKA Producer java客户端示例
查看>>
java -f_java学习笔记(一)
查看>>
java 什么题目好做_用java做这些题目
查看>>
java中的合同打印_比较方法违反了Java 7中的一般合同
查看>>
php 位运算与权限,怎么在PHP中使用位运算对网站的权限进行管理
查看>>
php include效率,php include类文件超时
查看>>
matlab sin函数 fft,matlab的fft函数的使用教程
查看>>
wcdma下行如何解扩解扰 matlab,WCDMA技术基础.ppt
查看>>
MySQL date_format() 函数
查看>>
mysql 时间处理
查看>>