神奇传送门

恩,这是一道神奇的LCA+难度的题目。

题目是这样的:

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

一开始看了看,以为是费用流(PS:一看就是费用流裸题嘛。。)

然后发现有Q个询问。。

完美TLE

然后zxyer狠狠D了我一顿(%%%)这才发现写LCA是正解。。(太像了woc)

好吧,说正解。

这道题出现了Q个询问,我们很快就会想到RMQ和LCA

可是这道题是个图,不一定是树。

根据最大生成树的性质(载重量最大的那条路径一定在最大生成树上)

RMQ处理区间最小值,而LCA有个性质,就是它一定在U到V的最短路上,而且是2个点到根节点的路径的第一个交点。所以到了LCA就没必要往上走了,

因为路径是公共的,结果不会比LCA更优;

然后RMQ处理最小值,再找一下LCA,输出载重量最小值

然后就AC啦

原来程序有BUG(好吧。终于DEBUG出来了。。)

注意!写CMP函数时,如果用>=号会爆栈!

下面贴程序~

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. int n,m,num=,q;
  6. struct edge{
  7. int next,to,value;
  8. }g[];
  9. int f[];
  10. int depth[];
  11. int visit[];
  12. int fa[][];
  13. int r[];
  14. int u[],v[],w[];
  15. int dist [][];
  16. int head[];
  17. int cmp(const int a,const int b) {
  18. return w[a]>w[b];}
  19. int getf(int x){
  20. return x==f[x]?x:f[x]=getf(f[x]);}
  21. void addedge(int u,int v,int value){
  22. g[++num].next=head[u];
  23. head[u]=num;
  24. g[num].to=v;
  25. g[num].value=value;
  26. }
  27. void kruskal(){
  28. for(int i=;i<=n;i++) f[i]=i;
  29. for(int i=;i<=m;i++) r[i]=i;
  30. sort(r+,r+m+,cmp);
  31. for(int i=;i<=m;i++)
  32. {
  33. int x=u[r[i]];
  34. int y=v[r[i]];
  35. x=getf(x);y=getf(y);
  36. if(x!=y){
  37. addedge(x,y,w[r[i]]);
  38. addedge(y,x,w[r[i]]);
  39. f[x]=y;
  40. }
  41. }
  42. }
  43. void prelca(int x){
  44. visit[x]=;
  45. for(int i=;(<<i)<=depth[x];i++)
  46. {
  47. int c=fa[x][i-];
  48. fa[x][i]=fa[c][i-];
  49. dist[x][i]=min(dist[x][i-],dist[c][i-]);
  50. }
  51. for(int i=head[x];i;i=g[i].next)
  52. {
  53. int v=g[i].to;
  54. if(!visit[v])
  55. {
  56. depth[v]=depth[x]+;
  57. fa[v][]=x;
  58. dist[v][]=g[i].value;
  59. prelca(v);
  60. }
  61. }
  62. }
  63. int lca(int x,int y)
  64. {
  65. int rr=;
  66. if(depth[x]<depth[y])swap(x,y);
  67. int dc=depth[x]-depth[y];
  68. for(int i=;(<<i)<=dc;i++)
  69. if(((<<i)&dc)&&fa[x][i])
  70. {
  71. rr=min(rr,dist[x][i]);
  72. x=fa[x][i];
  73.  
  74. }
  75. if(x==y)return rr;
  76. for(int i=;i>=;i--)
  77. if(fa[x][i]!=fa[y][i]&&depth[x]>=(<<i)&&fa[x][i])
  78. {
  79. rr=min(rr,min(dist[x][i],dist[y][i]));
  80. x=fa[x][i];
  81. y=fa[y][i];
  82. }
  83. return min(rr,min(dist[x][],dist[y][]));
  84. }
  85. int main(){
  86. scanf("%d%d",&n,&m);
  87. for(int i=;i<=m;i++)
  88. scanf("%d%d%d",&u[i],&v[i],&w[i]);
  89. kruskal();
  90. for(int i=;i<=n;i++)
  91. if(!visit[i])prelca(i);
  92. scanf("%d",&q);
  93. for(int i=;i<=q;i++)
  94. {
  95. int a,b;
  96. scanf("%d%d",&a,&b);
  97. if(getf(a)!=getf(b))printf("-1\n");
  98. else printf("%d\n",lca(a,b));
  99. }
  100. return ;
  101. }

注意:RMQ别打超限,调用空指针会WA的

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

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

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

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

    死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...

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

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

  4. [洛谷 P1967] 货车运输 (最大生成树 lca)

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

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

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

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

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

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

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

  8. NOIP2013 货车运输 LCA倍增+最大生成树

    #include <cstdio> #include <iostream> #include <ctime> #include <vector> #in ...

  9. NOIP2013货车运输[lca&&kruskal]

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

  10. [NOIP2013/Codevs3287]货车运输-最小[大]生成树-树上倍增

    Problem 树上倍增 题目大意 给出一个图,给出若干个点对u,v,求u,v的一条路径,该路径上最小的边权值最大. Solution 看到这个题第一反应是图论.. 然而,任意路径最小的边权值最大,如 ...

随机推荐

  1. 裸机——wdt

    1. 首先晓得看门狗的基本知识 看门狗是带复位功能的定时器,用于在系统跑飞时复位系统. 接下来按照上次的知识对看门狗进行推导 看门狗的关键词是 定时器 复位 定时器 关键是 时间段 中断 时间段 关键 ...

  2. Python logging 模块简介

    Table of Contents 1. Logging 模块 1.1. 简介 1.2. 简单输出日志 1.3. 输入日志到文件 1.4. 几个基本概念 1.4.1. loggers 1.4.2. h ...

  3. android singleTop 不起作用

    今天,排查问题,发现设置了singleTop 的activity, 多次启动依然是多个acitivity,而不是一个. 明明在清单里面设置了,但是就是启动了多个. 可能是因为启动的太快,导致系统判断有 ...

  4. Java 泛型 二

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...

  5. Hibernate SQL方言

    RDBMS 方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS3 ...

  6. how to export chrome speed dial extension?

    locate chrome-extension_dgpdioedihjhncjafcpgbbjdpbbkikmi_0.localstorage, copy it to you want, everyt ...

  7. cookie不能删除

    cookie不仅仅包含一个键值对,还包含域 domain  路径path, 一般domain是请求的地址 www.baidu.com/news.html 那domain就是www.baidu.com ...

  8. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  9. python pyinstaller 打包程序报错解决

    python打包exe,各种入坑 一.安装PyInstaller 1.安装pywin32 pip命令安装:pip install pywin32(推荐) 2.安装Pyinstaller pip命令安装 ...

  10. 解决使用vim-go插件时候保存go代码导致设置好的折叠消失的问题

    我之前在用vim编辑python代码的时候,折叠的功能都没啥问题 后来在编辑go代码的时候,我发现我一保存,折叠全都消失了,我很费解,就推断跟我使用的插件有关系,因为我保存的时候会触发gofmt插件格 ...