博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogo p3379 【模板】最近公共祖先(LCA)
阅读量:6967 次
发布时间:2019-06-27

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

【模板】最近公共祖先(LCA)

题意

  • 给一个树,然后多次询问(a,b)的LCA

    模板(主要参考一些大佬的模板)

#include
//自己的2点:树的邻接链表(静态)表示; lca 的倍增算法//优化 log[]const int maxn=500010;int N,M,S;//S根节点标号int head[maxn];//head[i]=k 以i为起点的第一条边是edge[k]int dep[maxn],dp[maxn][21];//dp[i][j] i向上走2^jint lg[maxn];//(log2(i)+1)struct edge{ int v,next;};edge egs[maxn<<1];int k=0;void getlg(){ for(int i=1;i<=n;i++){ lg[i]=lg[i-1]+((1<
=dep[b] a 向上走 for(int j=20;j>=0;j--){ if(dep[a]-(1<
=dep[b]){ a=dp[a][j]; } } if(a==b) return a; //a,b同时向上走 for(int i=20;i>=0;i--){ if(dp[a][i]!=dp[b][i]){ a=dp[a][i]; b=dp[b][i]; } } return dp[a][0];}int main(){ scanf("%d %d %d",&N,&M,&S); memset(head,-1,sizeof(head)); memset(dep,0,sizeof(dep)); memset(dp,0,sizeof(dp)); for(int i=1;i

加了lg[]数组优化的(略微快一点)

#include
//自己的2点:树的邻接链表(静态)表示; lca 的倍增算法//优化 log[]const int maxn=500010;int N,M,S;//S根节点标号int head[maxn];//head[i]=k 以i为起点的第一条边是edge[k]int dep[maxn],dp[maxn][21];//dp[i][j] i向上走2^jint lg[maxn];//(log2(i)+1)struct edge{ int v,next;};edge egs[maxn<<1];int k=0;void getlg(){ for(int i=1;i<=N;i++){ lg[i]=lg[i-1]+((1<
=dep[b] a 向上走 while(dep[a]>dep[b]){ a=dp[a][lg[dep[a]-dep[b]]-1]; } if(a==b) return a; //a,b同时向上走 for(int i=(lg[dep[a]]-1);i>=0;){ if(dp[a][i]!=dp[b][i]){ a=dp[a][i]; b=dp[b][i]; i=lg[dep[a]]; } else i--; } return dp[a][0];}int main(){ scanf("%d %d %d",&N,&M,&S); memset(head,-1,sizeof(head)); memset(dep,0,sizeof(dep)); memset(dp,0,sizeof(dp)); getlg(); for(int i=1;i

值得注意的问题

  • 初始化的位置
  • 树的邻接链表表示(真的比较省内存而且好用)
  • lca的倍增算法(还可以求树上两点距离)

转载于:https://www.cnblogs.com/fridayfang/p/9532296.html

你可能感兴趣的文章
window.showModalDialog
查看>>
mongodb分片扩展架构
查看>>
vue音乐项目歌手详情页小结
查看>>
JDBC读取新插入Oracle数据库Sequence值的5种方法
查看>>
Android studio ButterKnife插件
查看>>
ArrayList和LinkedList区别
查看>>
Spring 自动装配及其注解
查看>>
项目部署不到tomcat中的原因和解决方法
查看>>
jUnit Test遇到org.apache.ibatis.binding.BindingException
查看>>
vector排序与查找
查看>>
Py之any函数【转载】
查看>>
将字符串或者数字转化成英文格式输出
查看>>
[9.28模拟] good
查看>>
[NOIP2012] 借教室
查看>>
基于Confluent.Kafka实现的KafkaConsumer消费者类和KafkaProducer消息生产者类型
查看>>
NOI元丹
查看>>
Androidn Notification的使用,解决找不到setLatestEventInfo方法
查看>>
如何改变eclipse控制台编码
查看>>
Python 闭包相关之late binding机制
查看>>
关于复制
查看>>