http://codevs.cn/problem/3287/

题目描述

国有 座城市,编号从 ,城市之间有 条双向道路。每一条道路对车辆都有重
量限制,简称限重。现在有 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的
情况下,最多能运多重的货物。

输入格式

输入文件第一行有两个用一个空格隔开的整数 , 表示 国有 座城市和 条道
路。
接下来 行每行 个整数 ,每两个整数之间用一个空格隔开,表示从 号城市
号城市有一条限重为 的道路。注意: 不等于 ,两座城市之间可能有多条道路。
接下来一行有一个整数 ,表示有 辆货车需要运货。
接下来 行,每行两个整数 ,之间用一个空格隔开,表示一辆货车需要从 城市
运输货物到 城市,注意: 不等于

输出格式

输出共有 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货
车不能到达目的地,输出

输入样例

4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3

输出样例

3
-1
3

数据范围

题解

可以证明最优路径一定在最大生成树(森林)上,于是题目便转化为,询问森林中两点路径上边权最小值,连通性用并查集判断即可。

对于一棵树上的一次询问,可以用倍增的方法解决。

表示点 向上 步到达的结点                           

 表示点 向上  步的路径中的边权最小值

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<stack>
  8. #define N 10005
  9. #define M 50005
  10. #define depth 21
  11. using namespace std;
  12.  
  13. int n,m,q,cnt,tot,ans;
  14. int f[N],last[N],dep[N];
  15. int anc[N][],g[N][];
  16. struct hh
  17. {int to,next,w;}e[M<<];
  18. struct hhh
  19. {int l,r,w;}line[M<<];
  20. bool cmp(hhh a,hhh b){return a.w>b.w;}
  21. int read()
  22. {
  23. int ret=;char c=getchar();
  24. while(!isdigit(c))c=getchar();
  25. while(isdigit(c)){ret=(ret<<)+(ret<<)+c-'';c=getchar();}
  26. return ret;
  27. }
  28. void add(int a,int b,int w)
  29. {
  30. e[++tot].to=b;
  31. e[tot].next=last[a];
  32. e[tot].w=w;
  33. last[a]=tot;
  34. }
  35. void bfs(int root)
  36. {
  37. int i,j,now;
  38. stack<int> s;
  39. s.push(root);dep[root]=;
  40. for(i=;i<depth;i++) anc[root][i]=root;
  41. while(!s.empty())
  42. {
  43. now=s.top();s.pop();
  44. if(now!=root)
  45. for(i=;i<depth;i++)
  46. {
  47. anc[now][i]=anc[anc[now][i-]][i-];
  48. g[now][i]=min(g[now][i-],g[anc[now][i-]][i-]);
  49. }
  50. for(i=last[now];i;i=e[i].next)
  51. if(!dep[e[i].to])
  52. {
  53. anc[e[i].to][]=now;
  54. dep[e[i].to]=dep[now]+;
  55. g[e[i].to][]=e[i].w;
  56. s.push(e[i].to);
  57. }
  58. }
  59. }
  60. void swim(int& x,int h)
  61. {
  62. int i;
  63. for(i=;h;i++)
  64. {
  65. if(h&) x=anc[x][i];
  66. h>>=;
  67. }
  68. }
  69. int getlca(int x,int y)
  70. {
  71. int i,j;
  72. if(dep[x]<dep[y]) swap(x,y);
  73. swim(x,dep[x]-dep[y]);
  74. if(x==y) return x;
  75. while(true)
  76. {
  77. for(i=;anc[x][i]!=anc[y][i];i++);
  78. if(!i) return anc[x][];
  79. x=anc[x][i-];y=anc[y][i-];
  80. }
  81. }
  82. int query(int x,int y)
  83. {
  84. int i,ret=,h;
  85. h=dep[y]-dep[x];
  86. for(i=depth;i>=;i--)
  87. if((<<i)<=h)
  88. {
  89. h-=(<<i);
  90. ret=min(ret,g[y][i]);
  91. y=anc[y][i];
  92. }
  93. return ret;
  94. }
  95. int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
  96. int main()
  97. {
  98. int i,j,u,v,w,fx,fy,lca;
  99. n=read();m=read();
  100. for(i=;i<=m;i++)
  101. line[i].l=read(),line[i].r=read(),line[i].w=read();
  102. sort(line+,line++m,cmp);
  103. for(i=;i<=n;i++) f[i]=i;
  104. for(i=;i<=m;i++)
  105. {
  106. u=line[i].l;v=line[i].r;w=line[i].w;
  107. fx=find(u);fy=find(v);
  108. if(fx!=fy)
  109. {
  110. f[fx]=fy;cnt++;
  111. add(u,v,w);add(v,u,w);
  112. if(cnt==n-) break;
  113. }
  114. }
  115. for(i=;i<=n;i++)
  116. for(j=;j<depth;j++)
  117. g[i][j]=;
  118. bfs();
  119. q=read();
  120. for(i=;i<=q;i++)
  121. {
  122. u=read();v=read();
  123. if(find(u)!=find(v)){puts("-1");continue;}
  124. lca=getlca(u,v);
  125. ans=min(query(lca,u),query(lca,v));
  126. printf("%d\n",ans);
  127. }
  128. return ;
  129. }

【CODEVS 3287】【NOIP2013】火车运输的更多相关文章

  1. [Luogu 1967] NOIP2013 货车运输

    [Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...

  2. NOIP2013 货车运输(最大生成树,倍增)

    NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...

  3. [NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)

    一开始觉得是网络流..仔细一看应该是最短路,再看数据范围..呵呵不会写...这道题是最大生成树+最近公共祖先.第一次写..表示各种乱.. 因为要求运输货物质量最大,所以路径一定是在最大生成树上的.然后 ...

  4. codevs 3287 货车运输 NOIP2013提高组

    题目链接:http://codevs.cn/problem/3287/ 题解: 和bzoj3732一毛一样,只不过是找最大生成树和最小值罢了,具体参见我的bzoj3732的博客 #include< ...

  5. Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...

  6. Codevs 3287 货车运输 == 洛谷P1967

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 n 座城市,编 ...

  7. Codevs 3287 货车运输

    题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过 ...

  8. 货车运输(codevs 3287)

    题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过 ...

  9. NOIP2013 DAY2 T3火车运输

    传送门 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况 ...

随机推荐

  1. [原创]自定义控件之AndroidSegmentControlView,仿IOS平台UISegmentControlView,继承自View

    版权声明:本文为博主原创文章,转载请注明出处. 控件简介 UISegmentControl在IOS平台的App中非常常见,其控件如下图所示: 这种控件的主要作用是动态的更改界面的显示内容,一般应用于内 ...

  2. [原创]android开源项目源码解析(一)----CircleImageView的源码解析

    CircleImageView的代码很简洁,因此先将此工程作为源码解析系列的第一篇文章. 解析说明都在代码里了. /* * Copyright 2014 - 2015 Henning Dodenhof ...

  3. C#判断一个string是否为数字

    案一:Try...Catch(执行效率不高) private bool IsNumberic(string oText) { try { int var1=Convert.ToInt32 (oText ...

  4. Web 技术人员需知的 Web 缓存知识(转)

    最近的译文距今已有4年之久,原文有一定的更新.今天踩着前辈们的肩膀,再次把这篇文章翻译整理下.一来让自己对web缓存的理解更深刻些,二来让大家注意力稍稍转移下,不要整天HTML5, 面试题啊叨啊叨的~ ...

  5. quick2.26 android下http崩溃

    quick2.26 http android下崩溃解决方案 1.先去quick官网合并代码(QuickHTTPInterface.java,CCHTTPRequestAndroid.cpp) 2.屏蔽 ...

  6. angularjs, nodejs, express, gulp, karma, jasmine 前端方案整合

    今年转向做前端开发,主要是做angularjs开发,期间接触了nodejs平台,从此一发不可收拾. npm丰富的插件库,express 开发框架, grunt, gulp构建工具,karma测试管理工 ...

  7. (转)使用Custom Draw实现ListCtrl的重绘

    使用Custom Draw实现ListCtrl的重绘   common control 4.7版本介绍了一个新的特性叫做Custom Draw,这个名字显得模糊不清,让人有点摸不着头脑,而且MSDN里 ...

  8. xcode6.0 模拟器打不开

      只要设置下这个就行了 本来以为虚拟机的问题  都把虚拟机从新安装了 杯具啊

  9. WCF小白初试 错误之一:“有零个应用程序终结点”的解决办法

    遇到这类问题 应该是配置文件出现了问题 解决办法是将配置文件中的<service name="命名空间+类名">就可以解决

  10. js中加密及设置cookie

    1.设置cookie及有效期时长 //cname:cookie的名称,cvalue:cookie的内容,exdays:cookie有效期时长: function setCookie(cname, cv ...