lca

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define maxn 30010
 5 #define S 16
 6 
 7 using namespace std;
 8 int n,m,num,head[maxn],fa[maxn][S+5],deep[maxn],p1,p2,ans;
 9 struct node{
10     int from;
11     int to;
12     int next;
13 }e[maxn*2];
14 
15 void add(int from,int to)
16 {
17     e[++num].from=from;
18     e[num].to=to;
19     e[num].next=head[from];
20     head[from]=num;
21 }
22 
23 void swap(int &a,int &b)
24 {
25     int t=a;a=b;b=t;
26 }
27 
28 void init()
29 {
30     scanf("%d",&n);
31     int x,y;
32     for(int i=1;i<=n-1;i++)
33       {
34           scanf("%d%d",&x,&y);
35           add(x,y);add(y,x);
36       }
37 }
38 void get_fa()
39 {
40     for(int j=1;j<=S;j++)
41       for(int i=1;i<=n;i++)
42         fa[i][j]=fa[fa[i][j-1]][j-1];
43 }
44 
45 void Dfs(int now,int from,int c)//每个点所在层数 
46 {
47     fa[now][0]=from;
48     deep[now]=c;
49     for(int i=head[now];i;i=e[i].next)
50      {
51          int v=e[i].to;
52          if(v!=from)
53            Dfs(v,now,c+1);
54      }
55 }
56 
57 int get_same(int a,int t)
58 {
59     for(int i=0;i<16;i++)
60      if(t&(1<<i)) a=fa[a][i];
61     return a;
62 }
63 
64 int LCA(int a,int b)
65 {
66     if(deep[a]<deep[b]) swap(a,b);//保证a深度大 
67     a=get_same(a,deep[a]-deep[b]);//得到a向上deep[a]-deep[b]层是谁 即a的与b同层的祖先是谁
68     if(a==b) return a;//如果汇聚到一个点 就不用往上了
69     for(int i=S;i>=0;i--)//从最大值开始循环 一开始 fa[a][i]  fa[b][i]一定是相等的
70                        //因为此时位于他们lca之上 然后往下 这里可以覆盖每一层 
71     {
72         if(fa[a][i]!=fa[b][i])
73                 {
74                     a=fa[a][i];
75                     b=fa[b][i];
76               }
77     }
78         return fa[a][0];
79 }
80 
81 int main()
82 {
83     init();
84     Dfs(1,1,0);
85     get_fa();
86     scanf("%d%d",&m,&p1);
87     for(int i=1;i<=m-1;i++)
88       {
89           scanf("%d",&p2);
90           int anc=LCA(p1,p2);
91           ans+=deep[p1]+deep[p2]-2*deep[anc];
92           p1=p2;
93       }
94     printf("%d\n",ans);
95     return 0;
96 }

 

 

 1 // LCA
 2 const int maxn = 100003;
 3 const int maxl = 19;
 4 
 5 struct Edge {
 6     int t;
 7     Edge *ne;
 8 };
 9 
10 int dep[maxn], up[maxn][maxl];
11 
12 void DFS(int u) {
13     for (int i = 1; i < maxl; ++ i) {
14         up[u][i] = up[up[u][i - 1]][i - 1];
15     }
16     for (Edge* e = head[u]; e; e = e->ne) { // 枚举儿子
17         if (!dep[e->t]) {
18             dep[e->t] = dep[u] + 1;
19             up[e->t][0] = u;
20             DFS(e->t);
21         }
22     }
23 }
24 
25 int LCA(int u, int v) {
26     if (dep[u] < dep[v]) {
27         swap(u, v);
28     }
29     for (int i = maxl - 1; i >= 0; -- i) {
30         if (dep[up[u][i]] >= dep[v]) {
31             u = up[u][i];
32         }
33     }
34     if (u == v) {
35         return u;
36     }
37     for (int i = maxl - 1; i >= 0; -- i) {
38         if (up[u][i] != up[v][i]) {
39             u = up[u][i];
40             v = up[v][i];
41         }
42     }
43     return up[u][0];
44 }
45 
46 int main() {
47     memset(dep, -1, sizeof(dep));
48     dep[1] = 0;
49     up[1][0] = 0;
50     DFS(1);
51     while (q --) {
52         int u, v;
53         cin >> u >> v;
54         cout << LCA(u, v) << endl;
55     }
56 }

 

posted @ 2017-01-23 16:03  InWILL  阅读(156)  评论(0)    收藏  举报