#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 30000 + 10;
int head[MAXN],f[MAXN],from[MAXN*2],to[MAXN*2],deep[MAXN],tt;
vector<int> query[MAXN];
bool vis[MAXN];
int n,m,ans;
int find(int x)
{
return f[x] == x ? x:f[x] = find(f[x]);
}
void addEdge(int u,int v)
{
from[++tt] = v,to[tt] = head[u],head[u] = tt;
from[++tt] = u,to[tt] = head[v],head[v] = tt;
}
void lca(int x,int d)
{
deep[x] = d;
for(int i = head[x]; i; i=to[i])
if(!deep[from[i]])
{
lca(from[i],d+1);
f[from[i]] = x;
}
for(int i = 0; i<(int)query[x].size(); i++)
{
int v = query[x][i];
if(vis[v])
{
int tf = find(v);
ans += deep[x] + deep[v] - deep[tf]*2;
}
}
vis[x] = true;
}
int main()
{
while(scanf("%d",&n) !=EOF)
{
tt = 0;
int a,b;
for(int i = 1; i<=n-1; i++)
{
scanf("%d %d",&a,&b);
addEdge(a,b);
}
scanf("%d",&m);
scanf("%d",&a);
for(int i = 1; i<m; i++)
{
scanf("%d",&b);
query[a].push_back(b);
query[b].push_back(a);
a = b;
}
for(int i = 0; i<=n; i++)
f[i] = i;
memset(vis,false,sizeof(vis));
memset(deep,0,sizeof(deep));
ans = 0;
lca(1,1);
printf("%d\n",ans);
}
return 0;
}
CODE[VS] 1036商务旅行
最新推荐文章于 2022-01-11 19:32:27 发布