博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCA(st算法)
阅读量:6956 次
发布时间:2019-06-27

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

#include
#include
#include
#include
#include
#define maxn 500000using namespace std;int dp[1001000][20];int to[maxn*2],be[maxn*2],ne[2*maxn],e;int deep[maxn*2],first[2*maxn],cnt,n;bool p[maxn];void add(int x,int y){ to[++e]=y; ne[e]=be[x]; be[x]=e;}void dfs(int v,int deepth){ p[v]=1,dp[++cnt][0]=v,first[v]=cnt; for(int i=be[v];i;i=ne[i]){ if(!p[to[i]]){ deep[to[i]]=deepth; dfs(to[i],deepth+1); dp[++cnt][0]=v; } }}void st(int n){ int len=log2(n)+1; for(int i=1;i<=len;i++){ for(int j=1;j<=n;j++){ if(j+(1<<(i-1))>n)continue; if(deep[dp[j][i-1]]
<<(i-1))][i-1]]) dp[j][i]=dp[j][i-1]; else dp[j][i]=dp[j+(1<<(i-1))][i-1]; } }}int rmq(int a,int b){ if(a>b)swap(a,b); int k1=log2(b-a+1); int x,y; x=dp[a][k1]; y=dp[b-(1<
deep[y])return y; else return x;}int main(){ int i,j,k,m; scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n-1;i++){ int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); } dfs(k,1); st(cnt); for(i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); printf("%d\n",rmq(first[x],first[y])); } return 0;}

转载于:https://www.cnblogs.com/brodrinkwater/p/7527997.html

你可能感兴趣的文章
《Objective-c》-(成员变量的作用域/作用范围)
查看>>
判断字符串是否为时间格式
查看>>
HTML框架1
查看>>
201621123075 Week02-Java基本语法与类库
查看>>
【实习记】2014-08-10(上)代码跟踪git的想法+归并排序的debug过程
查看>>
洛谷3805:【模板】manacher算法——题解
查看>>
POJ3666:Making the Grade——题解
查看>>
ZABBIX监控原理
查看>>
json 解析不出来 (No string key for value in object around character 6)
查看>>
mysql数据库配置open_files_limit过大导致数据库被OOM
查看>>
Dijkstra算法(迪杰斯塔拉算法)
查看>>
SDK编程模板
查看>>
避免反射和序列化来破坏单例
查看>>
js trim()
查看>>
POJ3468 线段树求和(线段树模板2)
查看>>
安装配置postgreSQL+pgcli+pgadmin3
查看>>
详解一下 javascript 中的比较
查看>>
用javascript实现jquery的trim方法
查看>>
编程入门:详细对比9门主流编程语言
查看>>
springcloud demo---hystrix
查看>>