题目:http://codevs.cn/problem/1036/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int maxSize=30000,maxN=20;
vector <int> M[maxSize+5];
int dis[maxSize+5],deep1[maxSize+5],anc[maxSize+5][maxN+2];
int n,m;
void dfs(int x,int fa)
{
int i,y;
for (i=0;i<M[x].size();i++)
{
y=M[x][i];
if (y!=fa)
{
dis[y]=dis[x]+1;
deep1[y]=deep1[x]+1;
anc[y][0]=x;
dfs(y,x);
}
}
}
void Initlca()
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=maxN;j++)
anc[i][j]=anc[anc[i][j-1]][j-1];
}
int lca(int x,int y)
{
int i;
if (deep1[x]<deep1[y])
swap(x,y);
for (i=maxN;i>=0;i--)
if (deep1[anc[x][i]]>=deep1[y])
x=anc[x][i];
if (x==y) return x;
for (i=maxN;i>=0;i--)
if (anc[x][i]!=anc[y][i])
{
x=anc[x][i];
y=anc[y][i];
}
return anc[x][0];
}
int main()
{
int i,x,y,z,ans=0;
freopen("a.txt","r",stdin);
scanf("%d",&n);
for (i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
M[x].push_back(y);
M[y].push_back(x);
}
dfs(1,1);
Initlca();
scanf("%d",&m);
x=1;
for (i=0;i<m;i++)
{
scanf("%d",&y);
z=lca(y,x);
ans=ans+dis[x]+dis[y]-2*dis[z];
x=y;
}
printf("%d\n",ans);
return 0;
}