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 }
倍增

 

posted @ 2019-09-25 11:34  Asurudo  阅读(200)  评论(0编辑  收藏  举报