codevs 1036 商务旅行

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
题目描述 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
  1. 5
  1. 1 2
  1. 1 5
  1. 3 5
  1. 4 5
  1. 4
  1. 1
  1. 3
  1. 2
  1. 5
样例输出 Sample Output

7

  1. #define N 60100
  2. #include<iostream>
  3. using namespace std;
  4. #include<cstdio>
  5. #include<cstring>
  6. #define C 20
  7. typedef long long ll;
  8. int ance[N>>][C],dis[N>>],n,a,b,m;
  9. ll sum=;
  10. struct Edge{
  11. int v,last;
  12. }edge[N<<];
  13. int deep[N>>],head[N>>],t=;
  14. void add_edge(int u,int v)
  15. {
  16. ++t;
  17. edge[t].v=v;
  18. edge[t].last=head[u];
  19. head[u]=t;
  20. }
  21. void input()
  22. {
  23. scanf("%d",&n);
  24. for(int i=;i<n;++i)
  25. {
  26. scanf("%d%d",&a,&b);
  27. add_edge(a,b);
  28. add_edge(b,a);/*注意树上建边必须是双向的*/
  29. }
  30. }
  31. void dfs(int k)
  32. {
  33. for(int l=head[k];l;l=edge[l].last)
  34. {
  35. if(!deep[edge[l].v])
  36. {
  37. dis[edge[l].v]=dis[k]+;
  38. ance[edge[l].v][]=k;
  39. deep[edge[l].v]=deep[k]+;
  40. dfs(edge[l].v);
  41. }
  42. }
  43. }
  44. void chuli_ance()
  45. {
  46. for(int i=;(<<i)<=n;++i)
  47. for(int j=;j<=n;++j)
  48. ance[j][i]=ance[ance[j][i-]][i-];
  49. }
  50. int lca(int a,int b)
  51. {
  52. int i,j;
  53. if(deep[a]<deep[b]) swap(a,b);
  54. for(i=;(<<i)<=deep[a];++i);
  55. i--;
  56. for(j=i;j>=;--j)
  57. if(deep[a]-(<<j)>=deep[b])
  58. a=ance[a][j];
  59. if(a==b) return a;
  60. for(j=i;j>=;--j)
  61. {
  62. if(ance[a][j]!=-&&ance[a][j]!=ance[b][j])
  63. {
  64. a=ance[a][j];
  65. b=ance[b][j];
  66. }
  67. }
  68. return ance[a][];
  69. }
  70. int main()
  71. {
  72. input();
  73. deep[]=;
  74. dis[]=;
  75. memset(ance,-,sizeof(ance));
  76. dfs();
  77. chuli_ance();
  78. scanf("%d",&m);
  79. scanf("%d",&a);
  80. int sta=a;
  81. for(int i=;i<=m;++i)
  82. {
  83. scanf("%d",&b);
  84. int zuxian=lca(a,b);
  85. sum+=(dis[a]+dis[b]-*dis[zuxian]);
  86. a=b;
  87. }
  88. sum+=dis[sta];
  89. cout<<sum<<endl;
  90. return ;
  91. }

倍增法-lca codevs 1036 商务旅行的更多相关文章

  1. CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )

    CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...

  2. codevs——1036 商务旅行

    1036 商务旅行  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 某首都城市的商人要经常 ...

  3. codevs 1036 商务旅行 (倍增LCA)

    /* 在我还不知道LCA之前 暴力跑的SPFA 70分 三个点TLE */ #include<iostream> #include<cstdio> #include<cs ...

  4. codevs 1036 商务旅行(Targin求LCA)

    传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...

  5. CODEVS 1036 商务旅行

    题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...

  6. 【最近公共祖先】【树链剖分】CODEVS 1036 商务旅行

    树链剖分求lca模板.O(log(n)),就是不倍增嘛~ #include<cstdio> #include<algorithm> using namespace std; # ...

  7. 【最近公共祖先】【块状树】CODEVS 1036 商务旅行

    在线块状树LCA模板. #include<cstdio> #include<vector> #include<algorithm> #include<cmat ...

  8. Codeforces 519E A and B and Lecture Rooms [倍增法LCA]

    题意: 给你一棵有n个节点的树,给你m次询问,查询给两个点,问树上有多少个点到这两个点的距离是相等的.树上所有边的边权是1. 思路: 很容易想到通过记录dep和找到lca来找到两个点之间的距离,然后分 ...

  9. CODEVS——T 1036 商务旅行

    http://codevs.cn/problem/1036/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descript ...

随机推荐

  1. sql 执行时间

    SET STATISTICS PROFILE ON SET STATISTICS IO ON SET STATISTICS TIME ON --GO /*--你的SQL脚本开始*/SELECT * F ...

  2. Discuz DB层跨库映射关系表名前缀BUG修复后产生的新bug

    新的逻辑引入了新的bug,会导致在跨多库连接时,产生表名前缀映射混乱,需要再做逻辑上的修复. function table_name($tablename) { if(!empty($this-> ...

  3. mysql启用慢日志查询

    查询超时时间:long_query_time  启动慢查日志:log_slow_queries={YES|NO} 启动慢查日志 : slow_query_log                    ...

  4. Visual Studio 2013 Preview 新功能

    先来看一下Visual Studio的版本历史: 1. Visual Studio.NET 2002 2. Visual Studio.NET 2003 3. Visual Studio.NET 20 ...

  5. Android 手机卫士15--程序锁

    1.基本思路 ①.创建已加锁应用的数据库(字段:_id,packagename),如果应用已加锁,将加锁应用的包名维护到数据库中 ②.已加锁+未加锁 == 手机中所有应用(AppInfoProvide ...

  6. [Tool] Windows 8.1安装SQL Server

    [Tool] Windows 8.1安装SQL Server 问题情景 因为工作的关系,需要在Windows 8.1.64Bit设备上安装SQL Server 2012.本来以为是个只要按下一步就可以 ...

  7. 【JavaEE】SSH+Spring Security自定义Security的部分处理策略

    本文建立在 SSH与Spring Security整合 一文的基础上,从这篇文章的example上做修改,或者从 配置了AOP 的example上做修改皆可.这里主要补充我在实际使用Spring Se ...

  8. Sublime Text3 快捷键汇总

    Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...

  9. 解决Win10服务主机本地系统网络受限

    换成win10有一段时间了,界面风格比win7好看,但有部分程序还是不兼容,还好用虚拟机可以将就解决.但有一个问题一直困扰了我好久,今天终于解决了. 问题描述 在进程中,服务主机:本地系统(网络受限) ...

  10. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...