luogu题目传送门!

首先,题目让我们求每个货车的最大运输量,翻译一下就是求路径上边权最小的边。

利用一下贪心思想可知,所有货车肯定都会尽量往大的边走。

进一步翻译,即为有一些小边货车根本不会走,或者说,我们只用知道点与点之间最大的连通路径就好了。

!!!

那么,我们求一下最大生成树,就可以知道最大连通图了。

然后来到第二步:求出了最大生成树,即树上点与点的路径只有一条,这条路也肯定是符合题目要求的。

那么,如何求出路径上最小的边?
暴力DFS?FLOYD?SPFA?

最快也是O(N*P)的复杂度让你通通T掉!

因此,面对如此多的询问,考虑在线维护的做法,不考虑问一次遍历一次的做法。

于是,众神仙便想出了倍增的做法:

在倍增的时候维护一个w, 和倍增的f类似, w应该存储指向w方向的最小边。

每次询问时,快速倍增取min就好了。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define N 500010
  4. #define INF (~0u>>1)
  5.  
  6. inline int read(){
  7. int x = , s = ;
  8. char c = getchar();
  9. while(!isdigit(c)){
  10. if(c == '-')s = -;
  11. c = getchar();
  12. }
  13. while(isdigit(c)){
  14. x = (x << ) + (x << ) + (c ^ '');
  15. c = getchar();
  16. }
  17. return x * s;
  18. }
  19.  
  20. struct edge{ // 临时存边
  21. int u, v, dis;
  22. } e[N];
  23.  
  24. struct node{
  25. int u, v, w;
  26. int next;
  27. } t[N];
  28. int head[N];
  29. int fa[N]; // 并查集
  30. int n, m;
  31.  
  32. int bian = ;
  33. inline void add(int u, int v, int w){
  34. t[++bian].u = u;
  35. t[bian].v = v;
  36. t[bian].w = w;
  37. t[bian].next = head[u];
  38. head[u] = bian;
  39. return ;
  40. }
  41.  
  42. bool cmp(edge a, edge b){
  43. return a.dis > b.dis;
  44. }
  45.  
  46. inline int find(int x){
  47. if(x == fa[x])return fa[x];
  48. else return fa[x] = find(fa[x]);
  49. }
  50.  
  51. inline void kruskal(int n, int m){ // 求最大生成树
  52. sort(e + , e + m + , cmp);
  53. for(int i = ;i <= n; i++)
  54. fa[i] = i; // 并查集初始化
  55. for(int i = ;i <= m; i++){
  56. int fau = find(e[i].u), fav = find(e[i].v);
  57. int u = e[i].u, v = e[i].v;
  58. if(fau != fav){
  59. fa[fau] = fav;
  60. add(u, v, e[i].dis);
  61. add(v, u, e[i].dis);
  62. }
  63. }
  64. return ;
  65. }
  66.  
  67. namespace LCA{
  68. int deth[N], f[N][];
  69. int w[N][];
  70. bool vis[N];
  71.  
  72. void dfs(int now){
  73. vis[now] = ;
  74. for(int i = head[now]; i; i = t[i].next){
  75. int v = t[i].v, u = t[i].u,dis = t[i].w;
  76. if(!vis[v]){
  77. deth[v] = deth[now] + ;
  78. w[v][] = dis; // w 储存指向v的边权, 在 LCA 初始化时应变成 LCA 路径上的最小值
  79. f[v][] = now; // f0 即为自己的上一个
  80. dfs(v);
  81. }
  82. }
  83. return ;
  84. }
  85.  
  86. int lca(int x, int y){
  87. if(find(x) != find(y))return -; // 两个点不连通
  88. int ans = INF;
  89. if(deth[x] > deth[y])swap(x, y);
  90. for(int i = ; i >= ;i--){
  91. if(deth[f[y][i]] >= deth[x]){
  92. ans = min(ans, w[y][i]);
  93. y = f[y][i]; // 先拉近距离
  94. }
  95. }
  96. if(x == y)return ans;
  97. for(int i = ;i >= ; i--){//优先跳大的
  98. if(f[x][i] != f[y][i]){
  99. ans = min(ans, min(w[x][i], w[y][i])); // 更新
  100. x = f[x][i];
  101. y = f[y][i];//上跳
  102. }
  103. }
  104. ans = min(ans, min(w[x][], w[y][])); // 更新
  105. return ans;
  106. }
  107.  
  108. void main(){
  109. for(int i = ;i <= n;i++){ // 恶心数据可能不连通
  110. if(!vis[i]){
  111. deth[i] = ;
  112. dfs(i);//第一次储存信息
  113. w[i][] = INF;// 开头,不可能有 w
  114. f[i][] = i;// 开头,本不配有 f。 因此存成自己
  115. }
  116. }
  117. for(int i = ;i <= ; i++){
  118. for(int j = ;j <= n; j++){
  119. f[j][i] = f[f[j][i-]][i-];
  120. w[j][i] = min(w[j][i-], w[f[j][i-]][i-]);//LCA初始化, w应保存 LCA路上指向j点方向的最小边
  121. }
  122. }
  123. int q = read();
  124. for(int i = ;i <= q; i++){
  125. int x = read(), y = read();
  126. printf("%d\n", lca(x, y));
  127. }
  128. return ;
  129. }
  130.  
  131. }
  132.  
  133. int main(){
  134. n = read(), m = read();
  135. for(int i = ;i <= m; i++){
  136. int x = read(), y = read(), z = read();
  137. e[i].u = x;
  138. e[i].v = y;
  139. e[i].dis = z;//第一次存储
  140. }
  141. kruskal(n, m);//求最大生成树
  142. LCA::main();
  143. return ;
  144. }

货车运输 noip2013 luogu P1967 (最大生成树+倍增LCA)的更多相关文章

  1. 「NOIP2013」「LuoguP1967」货车运输(最大生成树 倍增 LCA

    题目描述 AA国有nn座城市,编号从 11到nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最 ...

  2. TZOJ 4848 货车运输(最大生成树+倍增lca)

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

  3. 货车运输(最大生成树+倍增LCA)

    看到第一篇题解的神奇码风--我决定发一篇码风正常的题解造福人类 这题的做法也非常经典,最大生成树\(+LCA\),相当于先贪心一下,在LCA的时候记录一下当前最小的边权 顺便吐槽一下最后一个测试点: ...

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

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

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

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

  6. $Noip2013/Luogu1967$ 货车运输 最大生成树+倍增$lca$

    $Luogu$ $Sol$ 首先当然是构建一棵最大生成树,然后对于一辆货车的起点和终点倍增跑$lca$更新答案就好.记得预处理倍增的时候不仅要处理走了$2^i$步后是那个点,还有这中间经过的路径权值的 ...

  7. 洛谷P1967 货车运输 [noip2013] 图论

    正解:kruskal+LCA 解题报告: 哇真实心痛了...明明都没多少时间了我居然耗了一个上午+一个中午在上面?哭死辽我QAQ果然菜是原罪QAQ 然后这题,我先港下60pts做法趴?话说其实我觉得我 ...

  8. NOIP2013D1T3货车运输(最大生成树+倍增lca)

    传送门 这道题,先用kruskal求一遍图中的最大生成树. 然后,倍增求lca,求lca的同时求出边权的最小值. #include <cstring> #include <cstdi ...

  9. 货车运输-洛谷-1967-LCA+最大生成树(kruskal(并查集))

    传送门 一道:LCA+最大生成树 个人认为把这两个的板子写好(并熟练掌握了之后)就没什么难的 (但我还是de了好久bug)qwq 最大生成树:其实就是最小生成树的变形 我用的是kruskal (个人觉 ...

随机推荐

  1. 图论--最小环--Floyd模板

    #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> ...

  2. Vxlan L2

    VXLAN(Virtual eXtensible LAN可扩展虚拟局域网)诞生了,基于IP网络之上,采用的是MAC in UDP技术 跨三层实现二层通信 总结为何需要Vxlan: 虚拟机规模受到网络规 ...

  3. OSG程序设计之Hello World1.0

    对于从未接触过OSG的我来说,首先需要一个入门教程.在OSG论坛逛了半天,再加上google,最终决定使用<OSG程序设计>这本书. 下面就贴出书中的第一个例子:Hello World. ...

  4. js怎么删除数组元素,有哪些删除元素方法

    JavaScript删除元素方法 1.根据索引删除数组元素 delete 数组[索引]   *注意delete 后面是空格 var arr1=["aa","bb" ...

  5. SAP ME01创建货源清单

    1业务说明 此文档使用函数:ME_DIRECT_INPUT_SOURCE_LIST创建货源清单 2前台实现 事务代码:ME01 输入抬头信息 保存即可 3代码实现 3.1调用函数 定义参数 字段 调用 ...

  6. Excel:公式转数值

    跨Workbook引用有些危险,有时要把公式转换为数值.修改频繁,有时也要把公式转换为数值. 方法一,选中区域,复制Ctrl+C,选择性粘贴Ctrl+Alt+V,数值V.方法二,选中区域,复制Ctrl ...

  7. ApplicationInsights迁移国内躺的坑

    由于之前有段时间访问国际版的Application Insights实在是慢,而且又不是每个人都有梯子,然后国内版大概在去年(2019)六七月左右已经上线,想着也有一段时日了,要么就迁了吧. 然后实际 ...

  8. [csu1392]YY一下

    题意:给定x,求有多少个10^8以内的数满足这个数乘以x以后,最高位到了最低位.设最高位的数字和剩余长度,列等式推理即可. #pragma comment(linker, "/STACK:1 ...

  9. Elasticsearch系列---几个高级功能

    概要 本篇主要介绍一下搜索模板.映射模板.高亮搜索和地理位置的简单玩法. 标准搜索模板 搜索模板search tempalte高级功能之一,可以将我们的一些搜索进行模板化,使用现有模板时传入指定的参数 ...

  10. xilinx VDMA IP核使用

    VDMA实用配置说明 VDMA是通过AXI Stream协议对视频数据在PS与PL端进行搬运,开发者无需关注AXI Stream协议,在BlockDesign设计中只需要把相应信号进行连接即可. VD ...