【模板】倍增LCA
2017-07-09 19:40
316 查看
题号:洛谷3379
%:pragma GCC optimize ("Ofast") #include<cstdio> #include<vector> #include<cctype> inline int getint() { int ch; while(!isdigit(ch=getchar())); int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x; } const int N=500001,logN=19; std::vector<int> e ; int anc [logN+1]={{0}},dep ; inline void add_edge(const int u,const int v) { e[u].push_back(v); e[v].push_back(u); } void dfs(const int x,const int parent,const int depth) { anc[x][0]=parent,dep[x]=depth; for(int i=1;i<=logN;i++) { anc[x][i]=anc[anc[x][i-1]][i-1]; } for(unsigned int i=0;i<e[x].size();i++) { if(e[x][i]==parent) continue; dfs(e[x][i],x,depth+1); } } inline void swap(int &a,int &b) { int t; t=a; a=b; b=t; } int LCA(int a,int b) { if(dep[a]<dep[b]) swap(a,b); for(int i=logN;i>=0;i--) { if(dep[a]-(1<<i)>=dep[b]) a=anc[a][i]; } if(a==b) return a; for(int i=logN;i>=0;i--) { if(anc[a][i]&&anc[a][i]!=anc[b][i]) { a=anc[a][i]; b=anc[b][i]; } } return anc[a][0]; } int main() { int n=getint(),m=getint(),s=getint(); for(int i=1;i<n;i++) add_edge(getint(),getint()); dfs(s,0,0); while(m--) printf("%d\n",LCA(getint(),getint())); return 0; }
相关文章推荐
- {模板}LCA倍增
- 倍增LCA模板
- 倍增LCA模板
- 【 lca倍增模板】
- HDU-2586-How far away ?(倍增求LCA模板)
- 倍增LCA模板
- lca(最近公共祖先)倍增模板【pascal】
- [模板] - LCA倍增
- 算法模板——倍增求LCA
- 倍增求lca模板
- 【讲解+模板】最近公共祖先(LCA)(倍增)
- (倍增)最近公共祖先(LCA)模板
- 求LCA最近公共祖先的在线倍增算法模板_C++
- 模板 树上求LCA 倍增和树链剖分
- 倍增感受,以及lca倍增模板
- Hdu 2586 How far away ?【倍增LCA模板记录】
- 倍增法求LCA的模板
- POJ 1330 LCA倍增模板题
- 倍增法求lca 模板
- 倍增(RMQ与LCA)模板