博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu2586 lca模板(在线路径倍增)
阅读量:7008 次
发布时间:2019-06-28

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

这是基于二分搜索的,这个感觉更好写,利用任何整数可以由多个2^x次方数相加得到来进行向上路径倍增。

代码和思路一样,相比较RMQ更为简单==

1 #pragma comment(linker,"/STACK:16777216") 2 #include
3 #include
4 #include
5 using namespace std; 6 int now,head[100005],next[100005],point[100005],value[100005]; 7 int dis[100005],parent[100005][25],depth[100005]; 8 //距离根节点距离,某节点的向上走2^j的步节点,该时间深度 9 void add(int x,int y,int z)10 {11 next[++now]=head[x];12 head[x]=now;13 point[now]=y;14 value[now]=z;15 }16 void dfs(int u,int pre,int deep,int d)17 {18 dis[u]=d;19 parent[u][0]=pre;20 depth[u]=deep;21 for (int i=head[u];i;i=next[i])22 {23 int v=point[i],w=value[i];24 if (v==pre) continue;25 dfs(v,u,deep+1,d+w);26 }27 }28 void double_build(int n)29 {30 int i,j; 31 for (i=0;i+1<=20;i++)//路径倍增32 for (j=1;j<=n;j++)33 if (parent[j][i]<0) parent[j][i+1]=-1;34 else parent[j][i+1]=parent[parent[j][i]][i];35 }36 int double_query(int u,int v)37 {38 int i;39 if (depth[u]>depth[v]) swap(u,v);40 for (i=0;i<=20;i++)41 if ((depth[v]-depth[u])>>i&1)42 v=parent[v][i];43 if (u==v) return u;44 for (i=20;i>=0;i--) //二进制拆分思想达到倍增45 if (parent[u][i]!=parent[v][i])46 {47 u=parent[u][i];48 v=parent[v][i];49 }50 return parent[u][0];51 }52 int main()53 {54 int T,m,x,y,z,i,n;55 scanf("%d",&T);56 while (T--)57 {58 scanf("%d%d",&n,&m);59 now=0;60 memset(head,0,sizeof(head));61 for (i=1;i

题目链接:

转载于:https://www.cnblogs.com/xiao-xin/articles/4278021.html

你可能感兴趣的文章
CentOS6升级Python2.6到3.7,错误处理[No module named '_ctyp
查看>>
【游戏推荐】疯狂豹子王--OGEngine精品游戏推荐系列【三】
查看>>
致加西亚的信(一)
查看>>
折腾一天的WordPress
查看>>
主机是否扫描之fping
查看>>
一封来自网络的情书
查看>>
元数据和纬度
查看>>
Centos 下安装vsftp
查看>>
第 4 章 容器 - 022 - 如何运行容器?
查看>>
jqurey datatables属性
查看>>
新手上路--linux命令基础
查看>>
lvs之keepalived
查看>>
关于微信小程序横竖屏手机端及平板
查看>>
Sentence
查看>>
大数据开发怎么学的快?
查看>>
【蜕变之路】第10天 基本数据类型 (2019年2月28日)
查看>>
关于硬盘的一切!
查看>>
MYSQL5.7基于SSL的主从复制
查看>>
思科拓扑--小型公司案例实施和思路。
查看>>
淘宝搜索框的实现
查看>>