码迷,mamicode.com
首页 > 其他好文 > 详细

LCA【模板】

时间:2020-07-25 23:16:25      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:std   c++   bit   pre   i++   --   int   return   for   

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int tot,n,m,s,ver[2*5000010],head[2*500010],nxt[2*500010],f[500010][30],d[500010];
 4 void add(int x,int y){
 5     ver[++tot]=y;
 6     nxt[tot]=head[x];
 7     head[x]=tot;
 8 }
 9 void dfs(int u,int fa){
10     d[u]=d[fa]+1;
11     for(int i=1;(1<<i)<=d[u];i++)
12         f[u][i]=f[f[u][i-1]][i-1];
13     for(int i=head[u];i;i=nxt[i]){
14         int v=ver[i];
15         if(v==fa) continue;
16         f[v][0]=u;
17         dfs(v,u);
18     }
19 }
20 int LCA(int a,int b){
21     if(d[a]<d[b]) swap(a,b);
22     for(int i=20;i>=0;i--){
23         if(d[f[a][i]]>=d[b]) a=f[a][i];
24         if(a==b) return a;
25     }
26     for(int i=20;i>=0;i--)
27         if(f[a][i]!=f[b][i])
28             a=f[a][i],b=f[b][i];
29     return f[a][0];
30 }
31 int main(){
32     cin>>n>>m>>s;
33     for(int i=1;i<n;i++){
34         int x,y;
35         cin>>x>>y;
36         add(x,y);
37         add(y,x);
38     }
39     dfs(s,0);
40     while(m--){
41         int a,b;
42         cin>>a>>b;
43         cout<<LCA(a, b)<<endl;
44     }
45     return 0;
46 }

LCA【模板】

标签:std   c++   bit   pre   i++   --   int   return   for   

原文地址:https://www.cnblogs.com/integricode26/p/lowest-common-ancestors-template.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!