题目

这道题让我们求最小限重的最大值

显然可以先求出最大生成树,然后在树上进行操作

因为如果两点之间有多条路径的话一定会走最大的,而其他小的路径是不会被走的

然后考虑求最小权值

可以采用倍增求LCA,预处理时顺便把最小权值求出来

Code:

  1. #include<bits/stdc++.h>
  2. #define IO4 10000+10
  3. #define debug cout<<"Error"<<endl
  4. using namespace std;
  5. int n,m,q,cnt,cntt;
  6. //原图
  7. struct Edge {
  8. int from,to,wei;
  9. }e[*IO4];
  10. inline void ade(int u,int v,int w){
  11. e[++cnt].from=u;
  12. e[cnt].to=v;
  13. e[cnt].wei=w;
  14. }
  15. inline bool cmp(Edge a,Edge b){
  16. return a.wei>b.wei;
  17. }
  18. //最大生成树
  19. struct Edget {
  20. int nextt,tot,weit;
  21. }te[*IO4];
  22. int head[IO4];
  23. inline void adte(int u,int v,int w){
  24. te[++cntt].tot=v;
  25. te[cntt].weit=w;
  26. te[cntt].nextt=head[u];
  27. head[u]=cntt;
  28. }
  29. //并查集
  30. int fa[IO4];
  31. int fd(int x){
  32. return fa[x]==x?x:fa[x]=fd(fa[x]);
  33. }
  34. //Kruskal算法
  35. inline void Solve_MST(){
  36. int now=;
  37. sort(e+,e++cnt,cmp);
  38. for(int i=;i<=n;i++)fa[i]=i;
  39. for(int i=;i<=cnt;i++){
  40. int u=fd(e[i].from);
  41. int v=fd(e[i].to);
  42. if(u==v)continue;
  43. fa[u]=v;
  44. //建新图
  45. adte(u,v,e[i].wei);
  46. adte(v,u,e[i].wei);
  47. now++;
  48. if(now==n-)return;
  49. }
  50. }
  51. //搜索
  52. int f[IO4][],minw[IO4][],vis[IO4],dep[IO4];
  53. void DFS(int x){
  54. vis[x]=;
  55. for(int i=head[x];i;i=te[i].nextt){
  56. int tot=te[i].tot;
  57. if(vis[tot])continue;
  58. dep[tot]=dep[x]+;
  59. f[tot][]=x;
  60. //两个直接连接的点之间的最小权值就是这条边
  61. minw[tot][]=te[i].weit;
  62. DFS(tot);
  63. }
  64. }
  65. //预处理
  66. inline void Init(){
  67. for(int i=;i<=n;i++){
  68. if(!vis[i]){
  69. DFS(i);
  70. f[i][]=i;
  71. minw[i][]=0x3f3f3f3f;
  72. }
  73. }
  74. for(int l=;l<=;l++){
  75. for(int i=;i<=n;i++){
  76. f[i][l]=f[f[i][l-]][l-];
  77. //这里多了一步求最小权值
  78. //minw=min(前半minw,后半minw)
  79. minw[i][l]=min(minw[i][l-],minw[f[i][l-]][l-]);
  80. }
  81. }
  82. }
  83. //倍增求LCA(以下都是常规操作)
  84. inline int Solve_LCA(int x,int y){
  85. int ans=0x3f3f3f3f;
  86. if(fd(x)!=fd(y))return -;
  87. if(dep[x]<dep[y])swap(x,y);
  88. for(int l=;l>=;l--){
  89. if(dep[x]-(<<l)>=dep[y]){
  90. //注意要先取min否则x会改变
  91. ans=min(ans,minw[x][l]);
  92. x=f[x][l];
  93. }
  94. }
  95. if(x==y)return ans;
  96. for(int l=;l>=;l--){
  97. if(f[x][l]!=f[y][l]){
  98. //同上
  99. ans=min(ans,min(minw[x][l],minw[y][l]));
  100. x=f[x][l],y=f[y][l];
  101. }
  102. }
  103. //由于跳到LCA下面所以再取一步
  104. ans=min(ans,min(minw[x][],minw[y][]));
  105. return ans;
  106. }
  107.  
  108. int main(){
  109. ios::sync_with_stdio();
  110. cin>>n>>m;
  111. for(int i=;i<=m;i++){
  112. int x,y,z;
  113. cin>>x>>y>>z;
  114. ade(x,y,z);
  115. }
  116. Solve_MST();
  117. Init();
  118. cin>>q;
  119. for(int i=;i<=q;i++){
  120. int x,y;
  121. cin>>x>>y;
  122. cout<<Solve_LCA(x,y)<<endl;
  123. }
  124. return ;//完结撒花
  125. }

[洛谷P1967][题解]货车运输的更多相关文章

  1. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  2. 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)

    洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...

  3. 【洛谷1967】货车运输(最大生成树+倍增LCA)

    点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...

  4. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  5. 洛谷 P1967 货车运输

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

  6. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  7. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  8. 洛谷P1967 [NOIP2013提高组Day1T2]货车运输

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

  9. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...

随机推荐

  1. Airtest介绍与脚本入门

    前言 通过阅读本小节教程,你将了解以下内容: 一个Airtest脚本例子的详细解析 如何在Python脚本中调用Airtest接口 图片语句的参数介绍 Airtest介绍 Airtest是一款基于Py ...

  2. Scala函数式编程(四)函数式的数据结构 上

    这次来说说函数式的数据结构是什么样子的,本章会先用一个list来举例子说明,最后给出一个Tree数据结构的练习,放在公众号里面,练习里面给出了基本的结构,但代码是空缺的需要补上,此外还有预留的test ...

  3. c# 窗体开发3 文件处理技术

    以字节形式向磁盘写入数据通常称为字节流(比特流) 常常使用System.Io 常用的类 类 说明 File 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. ...

  4. Docker 构建私有仓库

    Docker Hub 目前Docker官方维护了一个公共仓库Docker Hub,其中已经包含了数量超过15000的镜像.大部分需求都可以通过在Docker Hub中直接下载镜像来实现. 可以在htt ...

  5. html元素是否包含另外一个元素,以及classList属性

    如何判断一个元素A包含了元素B呢?如果不用contains方法的话,如何做呢? 腾讯面试的时候也出了这道题啊,当时没看dom的知识,所以一抹黑哦... 那就判断B是否为A的child喽,那也就是A是B ...

  6. VMware修改默认开机方式

    .首先删除已经存在的符号链接 ---------------------------------------------------------------------------------- rm ...

  7. 如何把图片变得炫酷多彩,Python教你这样实现!

    有趣的图片 如何能让图片变得好玩?首先需要让它动起来!可如果是多张图片,我们还可以将其拼接起来组成gif动图,可一张图怎么玩?记得之前写过一个小练习,把一张图片拆分成九宫格的分片图.那么,能否由此下手 ...

  8. luogu P2947 [USACO09MAR]向右看齐Look Up |单调队列

    题目描述 Farmer John's N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again stan ...

  9. 手撕 JVM 垃圾收集日志

    下图是本篇的写作大纲,将从以下四个方面介绍怎么样处理 JVM 日志. 有准备才能不慌 想要分析日志,首先你得有日志呀,对不对.凡是未雨绸蒙总是没错的.所谓有日志的意思,你要把 JVM 参数配置好,日志 ...

  10. 最新28道java基础面试题-上

    28道java基础面试题 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪 ...