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

倍增求LCA

时间:2019-07-23 00:42:37      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:nbsp   lib   struct   get   return   ++   swa   scan   ring   

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cstdlib>
 6 using namespace std;
 7 #define maxn 500010
 8 
 9 int n,m,s,tot;
10 int deep[maxn],first[maxn],fa[maxn][22];
11 struct edge{
12     int nextx,to;
13 }e[maxn<<1];
14 
15 void add(int u,int v)
16 {
17     tot++;
18     e[tot].to=v;
19     e[tot].nextx=first[u];
20     first[u]=tot;
21 }
22 
23 void dfs(int x,int f,int depth)
24 {
25     deep[x]=depth;
26     fa[x][0]=f;
27     for(int i=1;(1<<i)<=deep[x];i++)//注意此处应从1开始,i-1必须为正
28         fa[x][i]=fa[fa[x][i-1]][i-1];
29     for(int i=first[x];i;i=e[i].nextx)
30     {
31         int u=e[i].to;
32         if(u==f)continue;
33         fa[u][0]=x;
34         dfs(u,x,depth+1);
35     }
36 }
37 
38 int get_lca(int x,int y)
39 {
40     if(deep[x]<deep[y])swap(x,y);
41     for(int i=20;i>=0;i--)//注意此处应从0开始循环,保证可以跳一步
42         if(deep[fa[x][i]]>=deep[y])x=fa[x][i];
43     if(x==y)return x;
44     for(int i=20;i>=0;i--)//从0开始,理由同上
45         if(fa[x][i]!=fa[y][i])
46             x=fa[x][i],y=fa[y][i];
47     return fa[x][0];
48 }
49 
50 int main()
51 {
52     scanf("%d%d%d",&n,&m,&s);
53     for(int i=1;i<=n-1;i++)
54     {
55         int a,b;
56         scanf("%d%d",&a,&b);
57         add(a,b),add(b,a);
58     }
59     dfs(s,s,1);
60     for(int i=1;i<=m;i++)
61     {
62         int a,b;
63         scanf("%d%d",&a,&b);
64         cout<<get_lca(a,b)<<"\n";
65     }
66     return 0;
67 }

 

倍增求LCA

标签:nbsp   lib   struct   get   return   ++   swa   scan   ring   

原文地址:https://www.cnblogs.com/KGW-/p/11229057.html

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