分析:
本来应该是最短路,但限制了必须路过的顺序,就变成了LCA模板题
又去看了一下挑战程序设计上的LCA,,,好菜
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 33000
int f[maxn][30];
int dep[maxn];
vector<int>E[maxn];
int n ;
int m ;
void dfs(int u,int p,int d)
{
f[u][0]= p;
dep[u] = d;
for(int i = 1 ; i <= 20 ; ++i){
f[u][i] = f[ f[u][i-1] ][ i-1 ];
}
for(int i = 0 ; i < E[u].size() ; ++i){
int v = E[u][i];
if( v != p )dfs( v , u , d+1 );
}
}
int query(int x,int y)
{
if( dep[x] > dep[y] ){
swap(x,y);
}
for(int i = 20 ; i >= 0 ; --i)
if( (dep[y] - dep[x]) >> i & 1 )y = f[y][i];
if( x == y ) return x;
for(int i = 20 ; i >= 0 ; --i){
if( f[x][i]!= f[y][i] ){
x = f[x][i];
y = f[y][i];
}
}
return f[x][0];
}
int main()
{
cin >> n;
for(int i = 1 ; i < n ; ++i){
int a, b;
scanf("%d %d",&a,&b);
E[a].push_back(b);
E[b].push_back(a);
}
dfs( 1,0,1 );
cin >> m;
int x , y , ans = 0;
m--;
cin >> x;
while( m-- ){
cin >> y;
int all = query( x,y ) ;
ans += dep[x] + dep[y] - 2*dep[all];
x = y;
}
cout << ans << endl;
}