RMQ求LCA
来源:互联网 发布:mysql删除表中数据 编辑:程序博客网 时间:2024/05/29 07:26
7 6 7个数6条边
3 7
3 4
4 5
4 6
5 1
6 2
求2和7的lca.
假如我们要询问 2 和7 的 LCA, 我们找到2和7 分别第一次出现的位置, 然后在这一个区间内找到深度最小的那个节点, 也就是节点 3, 显然它就是2 和7的 LCA.
#include<iostream>#include<cstdio>#include<cmath>using namespace std;int n,m,cnt,tot=0,x,y,head[505],vis[505],dfn[505],de[505],ofs[505],dp[505][9],ru[505],root;struct Egde{ int to,next;}edge[505];//表示边 void add_edge(int bg,int ed){ cnt++; edge[cnt].to=ed; edge[cnt].next=head[bg]; head[bg]=cnt;}void dfs(int u,int dep){ tot++; if(!vis[u]){ vis[u]=1;dfn[u]=tot; } de[tot]=dep; ofs[tot]=u; for(int e=head[u];e>0;e=edge[e].next) { int v=edge[e].to; dfs(v,dep+1); ofs[++tot]=u;//通过这句话tot加,使dfn[]增加******!*!*!*!*!*!*!*!!!*!***** }}void init()//dp[]表示哪个tot{ for(int j=0;(1<<j)<=tot;j++) { for(int i=1;i+(1<<j)<=tot;i++) { if(j==0) dp[i][j]=i; else //就不知道dp用来存什么,开始写的dp[i][j]=min(de[dp[i][j-1]],de[...]) { if(de[dp[i][j-1]]<de[dp[i+(1<<(j-1))][j-1]]) dp[i][j]=dp[i][j-1]; else dp[i][j]=dp[i+(1<<(j-1))][j-1];//注意这里的左移外括号 } } }}int RMQ(int p1,int p2)//p1,p2是位置 { int k=0; k=log2(p2-p1+1); if(de[dp[p1][k]]<de[dp[p2-(1<<k)+1][k]]) return ofs[dp[p1][k]]; else return ofs[dp[p2-(1<<k)+1][k]];}int lca(int v1,int v2){ if(dfn[v1]<dfn[v2]) return RMQ(dfn[v1],dfn[v2]);//4,12 else RMQ(dfn[v2],dfn[v1]);}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); add_edge(x,y); ru[y]++; } for(int i=1;i<=n;i++)if(ru[i]==0) root=i; dfs(root,1); init();// for(int i=1;i<=n;i++) // for(int j=head[i];j>0;j=edge[j].next)// cout<<edge[j].to<<":"<<dfn[edge[j].to]<<" ";// cout<<endl; cout<<lca(2,7)<<endl;}
现在你明白时间戳dfn,和欧拉序有什么用了吧?
时间复杂度是多少?
预处理n^2,询问o(1)
0 0
- RMQ在线求LCA
- RMQ求LCA
- RMQ求LCA
- lca&rmq
- 【RMQ & LCA】
- RMQ && LCA
- LCA+RMQ
- LCA && RMQ
- LCA+RMQ
- LCA&RMQ
- LCA&RMQ
- LCA&&RMQ
- 【codevs2370】小机房的树,RMQ求LCA
- ST(RMQ)算法(在线)求LCA
- Nearest Common Ancestors 【并查集找根节点】+【步近法在线求lca】or【LCA转RMQ】
- 【lca】lca转rmq poj1330
- 【lca】lca转rmq解法
- 【RMQ+LCA】ZOJ 3195
- textField和textView同时存在时的键盘监听
- PHP基础知识数组
- Volley 集成 okhttp3 的步骤
- java并发编程--共享对象的可见性
- jsp中的4大域对象
- RMQ求LCA
- 紫书动规 P282的问题 hdu2196 树形dp
- 博为峰Java技术文章 ——JavaSE Swing 下拉列表框的事件处理
- 贪心算法在找钱问题上的使用
- PHP基础知识运算符
- ehcache和spring
- CCF201509-1-数列分段
- LeetCode [292. Nim Game] 难度[easy]
- 设计模式学习--职责链模式