目录

先来证明下lemma: 图上2点间最小边权最大的路径一定在MST上

感性理解下:

每次kruskal algo都连接最大的不成环边

此时有2个未联通的联通块被连起来.

那么考虑u, v两点的联通块 : 它们并起来时选的边最大. (将比这条边大的边加入生成树不能使得u,v联通)

这个思想是kruskal重构树的基础(每个联通块选取一个代表点)

sb题, 但是做的噎屎了, 花了1.5h

我还是应该熟悉一下 最小生成树, 树上倍增和并查集

2个sb错误:

  1. 见code l58
  2. 并查集没初始化

code

  1. //file headers start
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #define rep(i, _st, _ed) for(register int i = (_st); i <= (_ed); ++i)
  5. int read(){
  6. int f = 1, ans = 0; char c = getchar();
  7. while(!isdigit(c)) {
  8. if(c == '-') f = -1;
  9. c = getchar();
  10. }
  11. while(isdigit(c)) {
  12. ans = ans * 10 + c - '0';
  13. c = getchar();
  14. }
  15. return ans * f;
  16. }
  17. void put(int num) { printf("%d\n", num); }
  18. void testread() { while(1) { int k = read(); put(k); if(!k) break;}}
  19. const int maxn = 10005, maxm = 50005;
  20. struct graph{
  21. int v, nxt, w;
  22. }edge[maxm*2];
  23. int head[maxn], n, m;
  24. void adde(int u, int v, int w){
  25. static int cnt = 0;
  26. edge[++cnt].v = v, edge[cnt].w = w;
  27. edge[cnt].nxt = head[u], head[u] = cnt;
  28. }
  29. //file headers end
  30. struct ee{
  31. int u, v, w;
  32. bool operator<(const ee &rhs)const{return w>rhs.w;}
  33. }e[maxm];
  34. int fa[maxn];
  35. int find(int u) {return (fa[u]==u)?u:fa[u] = find(fa[u]);}
  36. int dep[maxn], f[21][maxn], vis[maxn], d[21][maxn];
  37. void dfs(int u, int fa){
  38. dep[u] = dep[fa]+1, vis[u] = 1;
  39. f[0][u] = fa;
  40. for(int i = head[u]; i; i = edge[i].nxt){
  41. if(edge[i].v!=fa)dfs(edge[i].v, u), d[0][edge[i].v] = edge[i].w;
  42. }
  43. }
  44. int lcapth(int u, int v){
  45. int ans = 1e9;
  46. if(dep[u] < dep[v]) swap(u, v);
  47. int i = 20;
  48. for(i = 20; i >= 0; i--)
  49. if(dep[f[i][u]] >= dep[v]) ans = min(ans, d[i][u]), u = f[i][u];
  50. if(u == v) return ans;
  51. for(i = 20; i >= 0; i--){
  52. if(f[i][u] != f[i][v] ) { //omg 这里是f[i][u]不是dep[f[i][u]]
  53. ans = min(ans, d[i][u]), ans = min(ans, d[i][v]);
  54. u = f[i][u], v = f[i][v];
  55. }
  56. }
  57. return min(ans, min(d[0][u], d[0][v]));
  58. }
  59. signed main(){
  60. //fileop("test");
  61. n = read(), m = read();
  62. rep(i, 1, m) {
  63. int u = read(), v = read(), w = read();
  64. e[i].u = u, e[i].v = v, e[i].w = w;
  65. }
  66. sort(e+1, e+m+1);
  67. rep(i, 1, n) fa[i] = i; //don't forget initialize bcj!!!
  68. rep(i, 1, m){
  69. if(find(e[i].v) != find(e[i].u)){
  70. adde(e[i].u, e[i].v, e[i].w), adde(e[i].v, e[i].u, e[i].w);
  71. fa[find(e[i].v)] = find(e[i].u);
  72. //printf("%d %d\n", e[i].u, e[i].v);
  73. }
  74. }
  75. rep(i, 1, n) if(vis[i] == 0) dfs(i, 0), f[0][i] = i, d[0][i] = 1e9; //root should form self loop
  76. rep(i, 1, 20)rep(j, 1, n) f[i][j] = f[i-1][f[i-1][j]], d[i][j] = min(d[i-1][j], d[i-1][f[i-1][j] ]);
  77. int q = read();
  78. while(q--){
  79. int u = read(), v = read();
  80. if(find(u) == find(v)) put(lcapth(u, v));
  81. else put(-1);
  82. }
  83. return 0;
  84. }
  85. /*
  86. 5 7
  87. 4 3 4440
  88. 3 1 22348
  89. 1 3 28368
  90. 2 4 25086
  91. 5 3 6991
  92. 4 3 10638
  93. 3 1 11106
  94. 4
  95. 4 5
  96. 1 3
  97. 5 4
  98. 2 5
  99. */

NOIP2013 D1T3 货车运输 zz耻辱记的更多相关文章

  1. NOIP2013 D1T3 货车运输

    [NOIP2013T3]货车运输 背景 noip2013day1 描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重 量限制,简称限重.现在有 q 辆货 ...

  2. NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并

    思路: Kruskal求最大生成树+倍增LCA // by SiriusRen #include <cstdio> #include <cstring> #include &l ...

  3. xsy 2018 【NOIP2013】货车运输

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

  4. 【NOIP2013】货车运输

    感觉这题挺水的……真的挺水的…… 原题: A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车 ...

  5. 【CJOJ1090】【洛谷1967】【NOIP2013】货车运输

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

  6. 【NOIP2013】货车运输 最大生成树+LCA

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

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

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

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

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

  9. 【NOIP2013】货车运输 最大生成树+倍增

    题目大意:给你一张n个点m条边的图,有q次询问,每次让你找出一条从x至y的路径,使得路径上经过的边的最小值最大,输出这个最大的最小值. 显然,经过的路径必然在这张图的最大生成树上. 我们求出这个图的最 ...

随机推荐

  1. System系统类

    System系统类 : 主要的作用是用于获取系统的一个参数. System类需要掌握的方法: arraycopy(Object src, int srcPos, Object dest, int de ...

  2. [Reinforcement Learning] Cross-entropy Method

    Cross-entropy Method(简称CEM)虽然是一种基于交叉熵的算法,但并不是我们熟知的监督学习中的交叉熵方法,与其说它是一种基于交叉熵的算法,倒不如说是一种基于蒙特卡洛和进化策略的算法. ...

  3. JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法

    本文实例讲述了js+CSS实现弹出一个全屏灰黑色透明遮罩效果的方法.分享给大家供大家参考.具体分析如下: 在众多的网站都有这样的效果,当进行一定的操作之后,会弹出一个灰黑色的半透明的遮罩,在上面可以操 ...

  4. html-webpack-plugin详解

    引言 我们来看看主要作用: 为html文件中引入的外部资源如script.link动态添加每次compile后的hash,防止引用缓存的外部文件问题 可以生成创建html入口文件,比如单页面可以生成一 ...

  5. css3混合模式

    https://juejin.im/entry/5b4802d15188251ac446d3a9

  6. Css - 选择器和样式

    Css - 选择器和样式 标签选择器 即使用html标签作为选择对象 <style>     div{ background:red; } </style> <div&g ...

  7. kali中的webshell工具--webacoo

    webacoo webshell其实就是放置在服务器上的一段代码 kali中生成webshell的工具 WeBaCoo(Web Backdoor Cookie) 特点及使用方法 类终端的shell 编 ...

  8. selenium采用xpath方法识别页面元素

    有些HTML页面中的元素中属性较少,经常有找不到id.class.name等常用属性的时候,这个时候xpath.css就能很好的识别到我们的元素. Firefox和chrome浏览器中均有xpath. ...

  9. 【easy】532. K-diff Pairs in an Array

    这道题给了我们一个含有重复数字的无序数组,还有一个整数k,让我们找出有多少对不重复的数对(i, j)使得i和j的差刚好为k.由于k有可能为0,而只有含有至少两个相同的数字才能形成数对,那么就是说我们需 ...

  10. 05mycat父子表

    表连接的难题在mycat中是不允许跨分片做表连接查询的 创建t_orders表 create table t_orders( id int PRIMARY key, customer_id int n ...