ACM模板——LCA
Posted asurudo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM模板——LCA相关的知识,希望对你有一定的参考价值。

1 #include <bits/stdc++.h> 2 #define _for(i,a,b) for(int i = (a);i < b;i ++) 3 #define _rep(i,a,b) for(int i = (a);i > b;i --) 4 #define INF 0x3f3f3f3f 5 #define pb push_back 6 #define maxn 500003 7 typedef long long ll; 8 using namespace std; 9 10 inline ll read() 11 12 ll ans = 0; 13 char ch = getchar(), last = ‘ ‘; 14 while(!isdigit(ch)) last = ch, ch = getchar(); 15 while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - ‘0‘, ch = getchar(); 16 if(last == ‘-‘) ans = -ans; 17 return ans; 18 19 inline void write(ll x) 20 21 if(x < 0) x = -x, putchar(‘-‘); 22 if(x >= 10) write(x / 10); 23 putchar(x % 10 + ‘0‘); 24 25 26 int N,M,S; 27 vector<int> G[maxn]; 28 bool vis[maxn]; 29 int depth[maxn]; 30 int fa[maxn][22]; 31 void dfs(int u) 32 33 vis[u] = 1; 34 _for(i,0,G[u].size()) 35 if(!vis[G[u][i]]) 36 37 depth[G[u][i]] = depth[u]+1; 38 fa[G[u][i]][0] = u; 39 dfs(G[u][i]); 40 41 42 void bz() 43 44 _for(j,1,21) 45 _for(i,1,N+1) 46 fa[i][j] = fa[fa[i][j-1]][j-1]; 47 48 int LCA(int u,int v) 49 50 //保证u深度较大 51 if(depth[u]<depth[v]) 52 swap(u,v); 53 54 int dc = depth[u]-depth[v]; 55 _for(i,0,21) 56 if((1<<i)&dc) 57 u = fa[u][i]; 58 59 if(u==v) return u; 60 _rep(i,20,-1) 61 if(fa[u][i]!=fa[v][i]) 62 u = fa[u][i],v = fa[v][i]; 63 64 return fa[u][0]; 65 66 int main() 67 68 N = read(); 69 M = read(); 70 S = read(); 71 _for(i,0,N-1) 72 73 int a = read(); 74 int b = read(); 75 G[a].pb(b); 76 G[b].pb(a); 77 78 //求深度 和处理 fa 79 dfs(S); 80 bz(); 81 _for(i,0,M) 82 83 int a = read(); 84 int b = read(); 85 write(LCA(a,b)); 86 printf("\n"); 87 88 return 0; 89
以上是关于ACM模板——LCA的主要内容,如果未能解决你的问题,请参考以下文章