题目描述 Description

某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间。

假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间。该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环。

你的任务是帮助该商人计算一下他的最短旅行时间。

输入描述 Input Description

输入文件中的第一行有一个整数N,1<=n<=30 000,为城镇的数目。下面N-1行,每行由两个整数a 和b (1<=ab<=n; a<>b)组成,表示城镇a和城镇b有公路连接。在第N+1行为一个整数M,下面的M行,每行有该商人需要顺次经过的各城镇编号。

输出描述 Output Description

在输出文件中输出该商人旅行的最短时间。

样例输入 Sample Input
5
1 2
1 5
3 5
4 5
4
1
3
2
5
样例输出 Sample Output

7

/*
倍增 LCA
*/
#include<cstdio>
#include<iostream>
#include<vector>
#define M 30010
#define S 20
using namespace std;
int deep[M],fa[M][S+],n,m;
vector<int> grap[M];
void dfs(int now,int from,int c)
{
fa[now][]=from;
deep[now]=c;
for(int i=;i<grap[now].size();i++)
if(from!=grap[now][i])
dfs(grap[now][i],now,c+);
}
void get_fa()
{
for(int j=;j<=S;j++)
for(int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-];
}
int get_same(int a,int t)
{
for(int i=;i<=S;i++)
if(t&(<<i)) a=fa[a][i];
return a;
}
int LCA(int a,int b)
{
if(deep[a]<deep[b])swap(a,b);
a=get_same(a,deep[a]-deep[b]);
if(a==b)return a;
for(int i=S;i>=;i--)
if(fa[a][i]!=fa[b][i])
{
a=fa[a][i];
b=fa[b][i];
}
return fa[a][];
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
grap[x].push_back(y);
grap[y].push_back(x);
}
dfs(,,);
get_fa();
int p1,p2,ans=;
scanf("%d%d",&m,&p1);
for(int i=;i<m;i++)
{
scanf("%d",&p2);
int zu=LCA(p1,p2);
ans+=(deep[p1]+deep[p2]-*deep[zu]);
p1=p2;
}
printf("%d",ans);
return ;
}

最新文章

  1. 1、Python基本概念
  2. GO语言面向对象
  3. oracle xmltype导入并解析Excel数据 (二)规则说明
  4. 推荐一个自动抽取pdf高亮笔记的web应用
  5. ExcelHelper
  6. Windows下获取本机IP地址方法介绍
  7. Python操作mysql之SQLAchemy(ORM框架)
  8. HDOJ 1856
  9. BZOJ3825 : [Usaco2014 Nov]Marathon
  10. POJ 2407 Relatives(欧拉函数)
  11. [POJ 2356] Find a multiple
  12. nginx自定义模块编写-根据post参数路由到不同服务器
  13. AFNetWorking 提交 NSArray 类型参数 取不到值的解决办法
  14. scala系列--基础语法
  15. Pairwise 找到你的另一半
  16. Javascript数组(一)排序
  17. laravel 解决保存Emoji 表情问题
  18. [SQL]某数据库中查出包含 字段名 的所有表名
  19. TCP/IP 笔记 - 链路层
  20. [转] VS2017 打包安装程序

热门文章

  1. nginx 编译某个模板的问题./configure: error: SSL modules require the OpenSSL library. You can either do not enable the modules, or install the OpenSSL library into the system, or build the OpenSSL library stati
  2. Python 元组、字典、集合操作总结
  3. var、let、const声明变量的区别
  4. 解决微信小程序要求的TLS版本必须大于等于1.2的问题(windows2008服务器)
  5. CSS - position属性小结
  6. quartz测试类
  7. ThreadLocal类使用说明
  8. solr 单机模式搭建
  9. jsDate()
  10. 王小胖之 URL编码和解码