【模板】LCA

又写了一个板子,本来准备多种姿势求lca的,结果只调出了树上倍增求lca,时(总)运(想)不(打)济(摆)啊

明天写好了 一言不合就立flag

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #define maxm 500050
 6 #define maxn 500050
 7 using namespace std;
 8 struct node{int to,next;}e[maxm*2];
 9 int cnt,head[maxn],deep[maxn],p[maxn][20],n,m,s;
10 void add(int x,int y)
11 {
12     e[++cnt]=(node){y,head[x]};head[x]=cnt;
13 }
14 inline void dfs(int u)
15 {
16     int i;
17     for(i=head[u];i;i=e[i].next)
18     {
19         if(!deep[e[i].to])
20         {
21             deep[e[i].to]=deep[u]+1;
22             p[e[i].to][0]=u;
23             dfs(e[i].to);
24         }
25     }
26  } 
27 void pre()
28 {
29     for(int j=1;j<=19;j++)
30      for(int i=1;i<=n;i++)
31      if(p[i][j-1]) p[i][j]=p[p[i][j-1]][j-1];
32 }
33  int lca(int a,int b)
34  {
35      int j;
36      if(deep[a]<deep[b]) swap(a,b);
37      for(j=19;j>=0;j--) 
38      if(deep[p[a][j]]>=deep[b])
39      a=p[a][j];
40      if(a==b) return a;
41      for( j=19;j>=0;j--)
42      {
43          if(p[a][j]!=p[b][j])
44          {
45              a=p[a][j];
46              b=p[b][j];
47          }
48      }
49      return p[a][0];
50  }
51  void work()
52  {
53      int x,y;
54      while(m--)
55      {
56          scanf("%d%d",&x,&y);
57          printf("%d\n",lca(x,y));
58     }
59  }
60 int main()
61 {
62     int x,y; 
63     scanf("%d%d%d",&n,&m,&s);
64     for(int i=1;i<n;i++)
65     {
66         scanf("%d%d",&x,&y);
67         add(x,y);add(y,x);
68     }
69     deep[s]=1; 
70     dfs(s);
71     pre();
72     work();
73     return 0;
74  } 
View Code

以上 By 啦啦啦萝卜

posted @ 2016-11-17 20:38  Native_carrot  阅读(186)  评论(0编辑  收藏  举报