题目地址:http://codevs.cn/problem/1036/
分析:
LCA
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
struct A
{
int u,v,next;
}s[74000];
int first[37000];
int de[37000];
int anc[37000][37];
int n,m,tot,num=1;
void add(int u,int v,int num)
{
s[num].next=first[u];
first[u]=num;
s[num].u=u;
s[num].v=v;
}
void dfs(int fa,int x)
{
if(de[x]) return ;
de[x]=de[fa]+1;
anc[x][0]=fa;
for(int i=1;anc[anc[x][i-1]][i-1];i++) {
anc[x][i]=anc[anc[x][i-1]][i-1];
}
for(int i=first[x];i;i=s[i].next) {
dfs(x,s[i].v);
}
}
int lca(int u,int v)
{
if(de[u]<de[v]) swap(u,v);
if(de[u]>de[v]) {
int dva=de[u]-de[v];
for(int i=0;i<=24;i++) {
if(dva&(1<<i)) {
u=anc[u][i];
}
}
}
if(u!=v) {
for(int i=24;i>=0;i--) {
if(anc[u][i]!=anc[v][i]) {
u=anc[u][i];
v=anc[v][i];
}
}
}
if(u==v) return u;
else return anc[u][0];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++) {
int u,v;
scanf("%d%d",&u,&v);
add(u,v,num++);
add(v,u,num++);
}
de[1]=1;
for(int i=first[1];i;i=s[i].next) {
dfs(1,s[i].v);
}
int a=1;
scanf("%d",&m);
for(int i=1;i<=m;i++) {
int b;
scanf("%d",&b);
int Lca=lca(a,b);
tot+=de[a]+de[b]-2*de[Lca];
a=b;
}
printf("%d",tot);
return 0;
}