倍增lca模板
来源:互联网 发布:传奇人物数据保存失败 编辑:程序博客网 时间:2024/06/06 02:10
看cf代码,看到别人写得那么简洁,学习了。
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;const int maxn=200020;int head[maxn],tol,deg[maxn],fa[maxn][23];struct node { int next,to;}edge[20*maxn];void add(int u,int v){ edge[tol].to=v; edge[tol].next=head[u]; head[u]=tol++;}void dfs(int u,int pre){ deg[u]=deg[pre]+1; fa[u][0]=pre; for(int i=1;i<23;i++)fa[u][i]=fa[fa[u][i-1]][i-1]; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(v==pre)continue; dfs(v,u); }}int lca(int x,int y){ if(deg[x]<deg[y])swap(x,y); for(int i=0;i<22;i++)if((deg[x]-deg[y])&(1<<i))x=fa[x][i]; if(x==y)return x; for(int i=22;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i]; return fa[x][0];}int main(){ int i,j,k,m,n; // freopen("data.in","r",stdin); // freopen("data.out","w",stdout); while(cin>>n>>m) { memset(head,-1,sizeof(head));tol=0; for(i=1;i<n;i++) { cin>>j>>k; add(j,k); add(k,j); } dfs(1,1); // for(i=1;i<=n;i++)cout<<deg[i]<<" ";cout<<endl; while(m--) { cin>>i>>j; cout<<lca(i,j)<<endl; } } return 0;}
0 0
- LCA倍增算法(模板)
- 倍增lca模板
- LCA倍增法模板
- 倍增LCA模板
- LCA倍增模板
- 倍增LCA 模板
- lca倍增算法模板
- {模板}LCA倍增
- LCA模板(倍增)
- 倍增LCA模板
- 倍增LCA模板
- 倍增LCA模板
- [模板]倍增LCA
- hdu2586 倍增lca模板
- 倍增感受,以及lca倍增模板
- 倍增求LCA的模板
- 倍增法求lca 模板
- LCA之倍增算法模板
- Why CCP is still using Python 2
- 练习1.31-练习1.34
- swap分区扩展
- libiberty required to compile MemProf
- ./startup.sh: /bin/sh^M: bad interpreter: 没有那个文件或目录 解决办法
- 倍增lca模板
- 怎样从oracle导入备份的数据
- Android中的JSON详细总结
- JBoss 系列八十四: 使用 JMS session 时的一个误区
- 如何面试有多年工作经验的高级程序员
- 学习笔记----图论学习中
- R Data Management(数据管理)
- 一些算法的MapReduce实现——图的BFS遍历
- 读博客”求一个整数中二进制数1的个数“两种方法分析