商务旅行(codevs 1036)
2024-09-08 14:21:30
题目描述 Description
某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间。
假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间。该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环。
你的任务是帮助该商人计算一下他的最短旅行时间。
输入描述 Input Description
输入文件中的第一行有一个整数N,1<=n<=30 000,为城镇的数目。下面N-1行,每行由两个整数a 和b (1<=a, b<=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、Python基本概念
- GO语言面向对象
- oracle xmltype导入并解析Excel数据 (二)规则说明
- 推荐一个自动抽取pdf高亮笔记的web应用
- ExcelHelper
- Windows下获取本机IP地址方法介绍
- Python操作mysql之SQLAchemy(ORM框架)
- HDOJ 1856
- BZOJ3825 : [Usaco2014 Nov]Marathon
- POJ 2407 Relatives(欧拉函数)
- [POJ 2356] Find a multiple
- nginx自定义模块编写-根据post参数路由到不同服务器
- AFNetWorking 提交 NSArray 类型参数 取不到值的解决办法
- scala系列--基础语法
- Pairwise 找到你的另一半
- Javascript数组(一)排序
- laravel 解决保存Emoji 表情问题
- [SQL]某数据库中查出包含 字段名 的所有表名
- TCP/IP 笔记 - 链路层
- [转] VS2017 打包安装程序
热门文章
- 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
- Python 元组、字典、集合操作总结
- var、let、const声明变量的区别
- 解决微信小程序要求的TLS版本必须大于等于1.2的问题(windows2008服务器)
- CSS - position属性小结
- quartz测试类
- ThreadLocal类使用说明
- solr 单机模式搭建
- jsDate()
- 王小胖之 URL编码和解码