。。。
和Kruskal生成树一样

本来是u,v连一条f的边

现在变成新建一个点,点权为f,u v都像它连无边权的边

(实际上应该是u的根和v的根)

这样树有一些性质:

1.二叉树

2.原树与新树两点间路径上边权(点权)的最大(最小)值相等

3.子节点的边权(大于等于)小于等于父亲节点

4.原树中两点之间路径上边权的最大(最小)值等于新树上两点的LCA的点权

  1. # include <iostream>
  2. # include <stdio.h>
  3. # include <stdlib.h>
  4. # include <algorithm>
  5. # include <string.h>
  6. # define IL inline
  7. # define ll long long
  8. # define Fill(a, b) memset(a, b, sizeof(a));
  9. using namespace std;
  10. IL ll Read(){
  11. char c = '%'; ll x = 0, z = 1;
  12. for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
  13. for(; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
  14. return x * z;
  15. }
  16. const int MAXN = 20001, MAXM = 200001;
  17. int ft[MAXN], n, m, cnt, fa[MAXN][20], w[MAXN], deep[MAXN], Fa[MAXN], num;
  18. struct Edge{
  19. int to, nt;
  20. } edge[MAXM];
  21. struct Kruskal{
  22. int u, v, f;
  23. IL bool operator <(Kruskal b) const{
  24. return f > b.f;
  25. }
  26. } road[MAXM];
  27. IL int Find(int x){
  28. return Fa[x] == x ? x : Fa[x] = Find(Fa[x]);
  29. }
  30. IL void Add(int u, int v){
  31. edge[cnt] = (Edge){v, ft[u]}; ft[u] = cnt++;
  32. edge[cnt] = (Edge){u, ft[v]}; ft[v] = cnt++;
  33. }
  34. IL void Dfs(int u){
  35. for(int e = ft[u]; e != -1; e = edge[e].nt){
  36. int v = edge[e].to;
  37. if(!deep[v]){
  38. deep[v] = deep[u] + 1;
  39. fa[v][0] = u;
  40. Dfs(v);
  41. }
  42. }
  43. }
  44. IL int LCA(int u, int v){
  45. if(Find(u) != Find(v)) return -1;
  46. if(deep[u] < deep[v]) swap(u, v);
  47. for(int i = 18; i >= 0; i--)
  48. if(deep[fa[u][i]] >= deep[v]) u = fa[u][i];
  49. if(u == v) return w[u];
  50. for(int i = 18; i >= 0; i--)
  51. if(fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
  52. return w[fa[u][0]];
  53. }
  54. int main(){
  55. Fill(ft, -1);
  56. num = n = Read(); m = Read();
  57. for(int i = 1; i <= 2 * n; i++)
  58. Fa[i] = i;
  59. for(int i = 1; i <= m; i++)
  60. road[i] = (Kruskal){Read(), Read(), Read()};
  61. sort(road + 1, road + m + 1);
  62. for(int i = 1, tot = 0; i <= m && tot < n; i++){
  63. int u = Find(road[i].u), v = Find(road[i].v);
  64. if(u != v){
  65. tot++;
  66. w[++num] = road[i].f;
  67. Fa[u] = Fa[v] = num;
  68. Add(u, num); Add(v, num);
  69. }
  70. }
  71. for(int i = num; i; i--)
  72. if(!deep[i]) deep[i] = 1, Dfs(i);
  73. for(int i = 1; i <= 18; i++)
  74. for(int j = 1; j <= num; j++)
  75. fa[j][i] = fa[fa[j][i - 1]][i - 1];
  76. int Q = Read();
  77. while(Q--){
  78. int u = Read(), v = Read();
  79. printf("%d\n", LCA(u, v));
  80. }
  81. return 0;
  82. }

Kruskal重构树(货车运输)的更多相关文章

  1. Luogu P1967 货车运输(Kruskal重构树)

    P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...

  2. NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)

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

  3. 洛谷p1967货车运输(kruskal重构树)

    题面 题解中有很多说最优解是kruskal重构树 所以 抽了个早自习看了看这方面的内容 我看的博客 感觉真的挺好使的 首先对于kruskal算法来说 是基于贪心的思想把边权排序用并查集维护是否是在同一 ...

  4. kruskal重构树学习笔记

    \(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal​\) 求最小(大)生成树,树上求 \(lca​\). 算法详 ...

  5. Kruskal重构树学习笔记+BZOJ3732 Network

    今天学了Kruskal重构树,似乎很有意思的样子~ 先看题面: BZOJ 题目大意:$n$ 个点 $m$ 条无向边的图,$k$ 个询问,每次询问从 $u$ 到 $v$ 的所有路径中,最长的边的最小值. ...

  6. 【BZOJ】3732: Network【Kruskal重构树】

    3732: Network Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2812  Solved: 1363[Submit][Status][Dis ...

  7. CF1253F Cheap Robot(神奇思路,图论,最短路,最小生成树/Kruskal 重构树/并查集)

    神仙题. 先考虑平方级别的暴力怎么做. 明显答案有单调性,先二分 \(c\). 先最短路预处理 \(dis_u\) 表示 \(u\) 到离它最近的充电站的距离(一开始把 \(1\) 到 \(k\) 全 ...

  8. 水壶-[Kruskal重构树] [解题报告]

    水壶 本来从不写针对某题的题解,但因为自己实在是太蠢了,这道题也神TM的恶心,于是就写篇博客纪念一下 H水壶 时间限制 : 50000 MS 空间限制 : 565536 KB 评测说明 : 2s,51 ...

  9. [bzoj 3732] Network (Kruskal重构树)

    kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...

  10. 【BZOJ 3732】 Network Kruskal重构树+倍增LCA

    Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT ...

随机推荐

  1. 低版本IE内核浏览器兼容placeholder属性解决办法

    最简便的一个方法,通过js实现. <input type="text" name="username" id="username" v ...

  2. 架构师入门:搭建基本的Eureka架构(从项目里抽取)

    没有废话,直接上干货,理论部分大家可以看其它资料. 这里是部分关键代码,如果需要全部可运行的代码,请给本人留言. 在后继,还将给出搭建高可用Eureka架构的方式. 1 Eureka的框架图 在Eur ...

  3. [转载]LVS+Keepalived之三大模式

    LVS + Keepalived之三大模式 ============================================================================== ...

  4. 【学习笔记】Hibernate 一对一关联映射 组件映射 二级缓存 集合缓存

    啊讲道理放假这十天不到啊 感觉生活中充满了绝望 这就又开学了 好吧好吧继续学习笔记?还是什么的 一对一关联映射 这次我们仍然准备了两个表 一个是用户表Users 一个是档案表Resume 他们的关系是 ...

  5. 01. SELECT显示和PRINT打印超长的字符

    从SQL Server 2005开始,引入了varchar(max) / nvarchar(max) 数据类型,表中可不使用LOB数据类型,从而突破单列8000 / 4000字符的限制,动态SQL也可 ...

  6. spring core 与 context理解

    Spring core是核心层,拥有这BeanFactory这个强大的工厂,是所有bean的管理器: 而spring context是上下文运行环境,基于spring core之上的一个架构, 它之上 ...

  7. rxjs-流式编程

    前言 第一次接触rxjs也是因为angular2应用,内置了rxjs的依赖,了解之后发现它的强大,是一个可以代替promise的框架,但是只处理promise的东西有点拿尚方宝剑砍蚊子的意思. 如果我 ...

  8. 求指定区间内与n互素的数的个数 容斥原理

    题意:给定整数n和r,求区间[1, r]中与n互素的数的个数. 详细见容斥定理 详细代码如下 int solve(int r, int n) { vector<int>p; p.clear ...

  9. 《清华梦的粉碎》by王垠

     清华梦的诞生 小时候,妈妈给我一个梦.她指着一个大哥哥的照片对我说,这是爸爸的学生,他考上了清华大学,他是我们中学的骄傲.长大后,你也要进入清华大学读书,为我们家争光.我不知道清华是什么样子,但是我 ...

  10. 在测试crontab执行脚本的时候,修改了linux的系统时间,crontab不执行了。

    今天在写服务器的perl脚本的时候,在完成一版脚本打算通过crontab来测试一下呢,因为直接执行脚本文件是没有问题的,但是当配置到crontab定期执行时就会出现问题,到了指定的时间了,但是脚本文件 ...