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 }