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的主要内容,如果未能解决你的问题,请参考以下文章

使用Pandoc构建Acm模板

acm 比赛模板

acm模板生成

ACM 算法大佬在 GitHub 把私藏刷题模板放开下载了

ACM模板线段树

ACM模板