您的位置:首页 > 其它

【模板】倍增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;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: