http://www.luogu.org/problem/show?pid=2680#sub

题目背景

公元 2044 年,人类进入了宇宙纪元。

题目描述

L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球。

小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物

流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去。显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰。

为了鼓励科技创新,L 国国王同意小 P 的物流公司参与 L 国的航道建设,即允许小 P 把某一条航道改造成虫洞,飞船驶过虫洞不消耗时间。

在虫洞的建设完成前小 P 的物流公司就预接了 m 个运输计划。在虫洞建设完成后, 这 m 个运输计划会同时开始,所有飞船一起出发。当这 m 个运输计划都完成时,小 P 的 物流公司的阶段性工作就完成了。

如果小 P 可以自由选择将哪一条航道改造成虫洞,试求出小 P 的物流公司完成阶段 性工作所需要的最短时间是多少?

输入输出格式

输入格式:

输入文件名为 transport.in。

第一行包括两个正整数 n、m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号。

接下来 n-1 行描述航道的建设情况,其中第 i 行包含三个整数 ai, bi 和 ti,表示第

i 条双向航道修建在 ai 与 bi 两个星球之间,任意飞船驶过它所花费的时间为 ti。

接下来 m 行描述运输计划的情况,其中第 j 行包含两个正整数 uj 和 vj,表示第 j个 运输计划是从 uj 号星球飞往 vj 号星球。

输出格式:

输出文件名为 transport.out。

共 1 行,包含 1 个整数,表示小 P 的物流公司完成阶段性工作所需要的最短时间。

输入输出样例

输入样例#1:

  1. 6 3
  2. 1 2 3
  3. 1 6 4
  4. 3 1 7
  5. 4 3 6
  6. 3 5 5
  7. 3 6
  8. 2 5
  9. 4 5
输出样例#1:

  1. 11

说明

所有测试数据的范围和特点如下表所示

请注意常数因子带来的程序效率上的影响。

【题目分析】

二分答案,如果一条航道的长度大于当前二分的答案,那么很明显这条航道上需要有一条边权值变为0,且条边权值应该>=(航道长度-二分的答案),那么若想使得所以不满足条件的航道都满足条件,这个虫洞就应该设置在这些航道的交集上,且权值应>=(max(航道长度)-二分的答案),航道的交集具体实现可以把这条航道上路径次数都加1,假设不满足条件的航道有m条,那么一条边如果次数==m条,就表示其是m条航道的交集了,实现的话一个dfs,复杂度O(nlogn)

  1. //T—T 95
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<vector>
  6. #include<set>
  7. using namespace std;
  8. #define maxn 600100
  9. int dp,pre[maxn],p[maxn],tt[maxn],ww[maxn],fa[maxn],deep[maxn],v[maxn],a[maxn],b[maxn],lca[maxn];
  10. int s[maxn][],n,m,sum[maxn],ans,cnt,dis[maxn],dist[maxn];
  11.  
  12. void gao(int x)
  13. {
  14. int i=p[x];
  15. while(i)
  16. {
  17. if(tt[i]!=fa[x])
  18. gao(tt[i]),
  19. sum[x]+=sum[tt[i]];
  20. i=pre[i];
  21. }
  22.  
  23. }
  24. int check(int x)
  25. {
  26. int cnt=,dec=;
  27. for(int i=;i<=n;i++)
  28. sum[i]=;
  29. for(int i=;i<=m;i++)
  30. if(dist[i]>x)
  31. {
  32. cnt++;
  33. dec=max(dec,dist[i]-x);
  34. sum[a[i]]++;
  35. sum[b[i]]++;
  36. sum[lca[i]]-=;
  37. }
  38. gao();
  39. for(int i=;i<=n;i++)
  40. if(sum[i]==cnt&&v[i]>=dec)
  41. return ;
  42. return ;
  43. }
  44. int getlca(int x,int y)
  45. {
  46. if(deep[x]>deep[y])
  47. x^=y^=x^=y;
  48. for(int i=;i>=;i--)
  49. if(deep[y]-deep[x]>=<<i)
  50. y=s[y][i];
  51. if(x==y) return x;
  52. for(int i=;i>=;i--)
  53. if(s[x][i]!=s[y][i])
  54. x=s[x][i],y=s[y][i];
  55. return fa[x];
  56. }
  57. void dfs(int x)
  58. {
  59. int i;
  60. i=p[x];
  61. while(i)
  62. {
  63. if(tt[i]!=fa[x])
  64. {
  65. deep[tt[i]]=deep[x]+ ;
  66. fa[tt[i]]=x;
  67. v[tt[i]]=ww[i];
  68. dis[tt[i]]=dis[x]+ww[i];
  69. dfs(tt[i]);
  70. }
  71. i=pre[i];
  72. }
  73. }
  74. void add(int x,int y,int z)
  75. {
  76. dp++;
  77. pre[dp]=p[x];
  78. p[x]=dp;
  79. tt[dp]=y;
  80. ww[dp]=z;
  81. }
  82. int main()
  83. {
  84. scanf("%d%d",&n,&m);
  85. for(int i=;i<n;i++)
  86. {
  87. int a,b,c;
  88. scanf("%d%d%d",&a,&b,&c);
  89. add(a,b,c);
  90. add(b,a,c);
  91. }
  92. dfs();
  93. for(int i=;i<=n;i++)
  94. s[i][]=fa[i];
  95. for(int i=;i<;i++)
  96. for(int j=;j<=n;j++)
  97. s[j][i]=s[s[j][i-]][i-];
  98. for(int i=;i<=m;i++)
  99. {
  100. scanf("%d%d",&a[i],&b[i]);
  101. lca[i]=getlca(a[i],b[i]);
  102. dist[i]=dis[a[i]]+dis[b[i]]-*dis[lca[i]];
  103. }
  104. int l=,r=;
  105. for(int i=;i<=m;i++)
  106. r=max(r,dist[i]);
  107. int mid;
  108. while(l<=r)
  109. {
  110. mid=(l+r)>>;
  111. if(check(mid)) r=mid-;
  112. else l=mid+;
  113. }
  114. printf("%d\n",l);
  115. return ;
  116. }

P2680 运输计划的更多相关文章

  1. 洛谷 P2680 运输计划 解题报告

    P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...

  2. 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)

    P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...

  3. P2680 运输计划(二分+树上差分)

    P2680 运输计划 链接 分析: 二分+树上差分. 首先可以二分一个答案,那么所有比这个答案大的路径,都需要减去些东西才可以满足这个答案. 那么减去的这条边一定在所有的路径的交集上. 那么如果求快速 ...

  4. Luogu P2680 运输计划(二分+树上差分)

    P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道 ...

  5. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

  6. [NOIP2015] 提高组 洛谷P2680 运输计划

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...

  7. luogu P2680 运输计划 (二分答案+树上差分)

    题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...

  8. 洛谷P2680 运输计划 [LCA,树上差分,二分答案]

    题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...

  9. 洛谷 P2680 运输计划(NOIP2015提高组)(BZOJ4326)

    题目背景 公元 \(2044\) 年,人类进入了宇宙纪元. 题目描述 公元\(2044\) 年,人类进入了宇宙纪元. L 国有 \(n\) 个星球,还有 \(n-1\) 条双向航道,每条航道建立在两个 ...

随机推荐

  1. MyEclipse下如何安装和使用ibatis插件(网上的资料对于myeclipse8.5根本就是没有用的,所以我还是自己选择了装了一个eclipse,然后将插件装在了eclipse中)

    (1)myeclipse→help→Myeclipse configuration center:点击sofeware选项卡,在Browes Software 下有一个输入框,点击add site按钮 ...

  2. ligerui_ligerTree_003_配置url参数,加载“树”

    配置url参数,加载“树”: 源码下载地址:http://download.csdn.net/detail/poiuy1991719/8571255 效果图:json.txt HTML代码: < ...

  3. drds 广播表的创建以及使用

    创建表 , 关键词 : BROADCAST CREATE TABLE `financial_product_yjw` ( `ID` int(10) unsigned NOT NULL AUTO_INC ...

  4. Junit单元测试-环境配置

    JUnit是Java单元测试框架,已经在Eclipse中默认安装.目前主流的有JUnit3和JUnit4.JUnit3中,测试用例需要继承TestCase类.JUnit4中,测试用例无需继承TestC ...

  5. println()函数输出int类型返回值错误的问题

    out.println(); 在用这个语句输出其他类返回大的int类型的数据的时候,注意输出错误. 例如: out.println(class1.方法()):  导致错误: our.println(c ...

  6. Spark实战1:shell+独立App使用总结

    Spark改进了Hadoop执行非流式算法的需要多次IO的缺陷,Spark的所有操作都是基于RDD弹性分布式数据集这种数据结构的,对RDD的操作主要的操作包括transform和action两种操作. ...

  7. shell 条件测试语句三种方法

    1.test -f file  2.[ -f file ] 3.[[ -f file ]] [ -f file1 -a -f file2]逻辑与[ -f file1 -o -f file2]逻辑或 [ ...

  8. tmpfs

    什么是tmpfs tmpfs是Linux/Unix系统上的一种基于内存的文件系统.tmpfs可以使用您的内存或swap分区来存储文件.由此可见,temfs主要存储暂存的文件. linux内核中的VM子 ...

  9. 【secureCRT】如何在secureCRT上设置常用的快捷输出按钮栏

    转自:http://jingyan.baidu.com/article/5d6edee2f32de199eadeec25.html 方法/步骤   打开secureCRT软件,单击菜单栏上面的[查看] ...

  10. android 常用命令

    1.查看当前手机界面的 Activity   dumpsys | grep "mFocusedActivity" 查看任务栈 dumpsys | grep "Hist&q ...