倍增法-lca codevs 1036 商务旅行
codevs 1036 商务旅行
某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间。
假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间。该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环。
你的任务是帮助该商人计算一下他的最短旅行时间。
输入文件中的第一行有一个整数N,1<=n<=30 000,为城镇的数目。下面N-1行,每行由两个整数a 和b (1<=a, b<=n; a<>b)组成,表示城镇a和城镇b有公路连接。在第N+1行为一个整数M,下面的M行,每行有该商人需要顺次经过的各城镇编号。
在输出文件中输出该商人旅行的最短时间。
- 5
- 1 2
- 1 5
- 3 5
- 4 5
- 4
- 1
- 3
- 2
- 5
7
- #define N 60100
- #include<iostream>
- using namespace std;
- #include<cstdio>
- #include<cstring>
- #define C 20
- typedef long long ll;
- int ance[N>>][C],dis[N>>],n,a,b,m;
- ll sum=;
- struct Edge{
- int v,last;
- }edge[N<<];
- int deep[N>>],head[N>>],t=;
- void add_edge(int u,int v)
- {
- ++t;
- edge[t].v=v;
- edge[t].last=head[u];
- head[u]=t;
- }
- void input()
- {
- scanf("%d",&n);
- for(int i=;i<n;++i)
- {
- scanf("%d%d",&a,&b);
- add_edge(a,b);
- add_edge(b,a);/*注意树上建边必须是双向的*/
- }
- }
- void dfs(int k)
- {
- for(int l=head[k];l;l=edge[l].last)
- {
- if(!deep[edge[l].v])
- {
- dis[edge[l].v]=dis[k]+;
- ance[edge[l].v][]=k;
- deep[edge[l].v]=deep[k]+;
- dfs(edge[l].v);
- }
- }
- }
- void chuli_ance()
- {
- for(int i=;(<<i)<=n;++i)
- for(int j=;j<=n;++j)
- ance[j][i]=ance[ance[j][i-]][i-];
- }
- int lca(int a,int b)
- {
- int i,j;
- if(deep[a]<deep[b]) swap(a,b);
- for(i=;(<<i)<=deep[a];++i);
- i--;
- for(j=i;j>=;--j)
- if(deep[a]-(<<j)>=deep[b])
- a=ance[a][j];
- if(a==b) return a;
- for(j=i;j>=;--j)
- {
- if(ance[a][j]!=-&&ance[a][j]!=ance[b][j])
- {
- a=ance[a][j];
- b=ance[b][j];
- }
- }
- return ance[a][];
- }
- int main()
- {
- input();
- deep[]=;
- dis[]=;
- memset(ance,-,sizeof(ance));
- dfs();
- chuli_ance();
- scanf("%d",&m);
- scanf("%d",&a);
- int sta=a;
- for(int i=;i<=m;++i)
- {
- scanf("%d",&b);
- int zuxian=lca(a,b);
- sum+=(dis[a]+dis[b]-*dis[zuxian]);
- a=b;
- }
- sum+=dis[sta];
- cout<<sum<<endl;
- return ;
- }
倍增法-lca codevs 1036 商务旅行的更多相关文章
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...
- codevs——1036 商务旅行
1036 商务旅行 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 某首都城市的商人要经常 ...
- codevs 1036 商务旅行 (倍增LCA)
/* 在我还不知道LCA之前 暴力跑的SPFA 70分 三个点TLE */ #include<iostream> #include<cstdio> #include<cs ...
- codevs 1036 商务旅行(Targin求LCA)
传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...
- CODEVS 1036 商务旅行
题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...
- 【最近公共祖先】【树链剖分】CODEVS 1036 商务旅行
树链剖分求lca模板.O(log(n)),就是不倍增嘛~ #include<cstdio> #include<algorithm> using namespace std; # ...
- 【最近公共祖先】【块状树】CODEVS 1036 商务旅行
在线块状树LCA模板. #include<cstdio> #include<vector> #include<algorithm> #include<cmat ...
- Codeforces 519E A and B and Lecture Rooms [倍增法LCA]
题意: 给你一棵有n个节点的树,给你m次询问,查询给两个点,问树上有多少个点到这两个点的距离是相等的.树上所有边的边权是1. 思路: 很容易想到通过记录dep和找到lca来找到两个点之间的距离,然后分 ...
- CODEVS——T 1036 商务旅行
http://codevs.cn/problem/1036/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Descript ...
随机推荐
- sql 执行时间
SET STATISTICS PROFILE ON SET STATISTICS IO ON SET STATISTICS TIME ON --GO /*--你的SQL脚本开始*/SELECT * F ...
- Discuz DB层跨库映射关系表名前缀BUG修复后产生的新bug
新的逻辑引入了新的bug,会导致在跨多库连接时,产生表名前缀映射混乱,需要再做逻辑上的修复. function table_name($tablename) { if(!empty($this-> ...
- mysql启用慢日志查询
查询超时时间:long_query_time 启动慢查日志:log_slow_queries={YES|NO} 启动慢查日志 : slow_query_log ...
- Visual Studio 2013 Preview 新功能
先来看一下Visual Studio的版本历史: 1. Visual Studio.NET 2002 2. Visual Studio.NET 2003 3. Visual Studio.NET 20 ...
- Android 手机卫士15--程序锁
1.基本思路 ①.创建已加锁应用的数据库(字段:_id,packagename),如果应用已加锁,将加锁应用的包名维护到数据库中 ②.已加锁+未加锁 == 手机中所有应用(AppInfoProvide ...
- [Tool] Windows 8.1安装SQL Server
[Tool] Windows 8.1安装SQL Server 问题情景 因为工作的关系,需要在Windows 8.1.64Bit设备上安装SQL Server 2012.本来以为是个只要按下一步就可以 ...
- 【JavaEE】SSH+Spring Security自定义Security的部分处理策略
本文建立在 SSH与Spring Security整合 一文的基础上,从这篇文章的example上做修改,或者从 配置了AOP 的example上做修改皆可.这里主要补充我在实际使用Spring Se ...
- Sublime Text3 快捷键汇总
Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...
- 解决Win10服务主机本地系统网络受限
换成win10有一段时间了,界面风格比win7好看,但有部分程序还是不兼容,还好用虚拟机可以将就解决.但有一个问题一直困扰了我好久,今天终于解决了. 问题描述 在进程中,服务主机:本地系统(网络受限) ...
- android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...