倍增LCA模板
来源:互联网 发布:c语言不同数据类型运算 编辑:程序博客网 时间:2024/06/06 00:19
poj 1330即一道倍增LCA模板题,注意在倍增往上跳时每个while语句的终止条件,WA了几次就是因为跳飞了。。。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>using namespace std;const int maxn=10004;int n;int head[maxn],num,in[maxn];int dep[maxn],f[maxn][14];struct EDGE { int t,nxt;}e[maxn<<1];inline void init() { memset(f,-1,sizeof(f)); memset(dep,0,sizeof(dep)); memset(in,0,sizeof(in)); memset(head,-1,sizeof(head)); num=0;}inline void adde(int u,int v) { e[num].nxt=head[u]; e[num].t=v; head[u]=num++;}void dfs(int p,int fa) { for (int i=head[p];i!=-1;i=e[i].nxt) { int j=e[i].t; dep[j]=dep[p]+1; f[j][0]=p;//initialize dp[j][0] dfs(j,p); }}inline void init_dp() { for (int j=1;(1<<j)<=n;j++)//start from 1 for (register int i=1;i<=n;i++) if (f[i][j-1]!=-1) f[i][j]=f[f[i][j-1]][j-1];}inline int lca(int a,int b) { int i=0; if (dep[b]>dep[a]) swap(a,b);//ensure that a is deeper while ((1<<i)<dep[a]) ++i; for (int j=i;j>=0;j--) if (dep[a]-(1<<j)>=dep[b]) a=f[a][j]; if (a==b) return a; for (int j=i;j>=0;j--) if (f[a][j]!=-1&&f[b][j]!=-1&&f[a][j]!=f[b][j]) a=f[a][j],b=f[b][j]; return f[a][0];}int main() { int u,v,kase; scanf("%d",&kase); while (kase--) { init(); scanf("%d",&n); for (register int i=1;i<n;i++) { scanf("%d%d",&u,&v); adde(u,v);++in[v]; } for (register int i=1;i<=n;i++) if (!in[i]) {dfs(i,0);break;} init_dp(); scanf("%d%d",&u,&v); printf("%d\n",lca(u,v)); } return 0;}
阅读全文
1 0
- LCA倍增算法(模板)
- 倍增lca模板
- LCA倍增法模板
- 倍增LCA模板
- LCA倍增模板
- 倍增LCA 模板
- lca倍增算法模板
- {模板}LCA倍增
- LCA模板(倍增)
- 倍增LCA模板
- 倍增LCA模板
- 倍增LCA模板
- [模板]倍增LCA
- hdu2586 倍增lca模板
- 倍增感受,以及lca倍增模板
- 倍增求LCA的模板
- 倍增法求lca 模板
- LCA之倍增算法模板
- HDFS的java操作
- 端口分类调研
- Python 装饰器
- 001_JavaScript简介
- 90. Subsets II
- 倍增LCA模板
- solrJ的使用
- COJ1973-给自己出题的小X
- windows注册表文件损坏了,导致windows无法启动,解决办法!
- sqlserver通用类库
- 写了一个Xcode的小demo遇到了一些问题
- 自我介绍小故事
- A simple math problem【打表找规律】
- API学习LinkedHashSet