。。。
和Kruskal生成树一样

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

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

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

这样树有一些性质:

1.二叉树

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

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

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

# include <iostream>
# include <stdio.h>
# include <stdlib.h>
# include <algorithm>
# include <string.h>
# define IL inline
# define ll long long
# define Fill(a, b) memset(a, b, sizeof(a));
using namespace std; IL ll Read(){
char c = '%'; ll x = 0, z = 1;
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
return x * z;
} const int MAXN = 20001, MAXM = 200001;
int ft[MAXN], n, m, cnt, fa[MAXN][20], w[MAXN], deep[MAXN], Fa[MAXN], num;
struct Edge{
int to, nt;
} edge[MAXM];
struct Kruskal{
int u, v, f;
IL bool operator <(Kruskal b) const{
return f > b.f;
}
} road[MAXM]; IL int Find(int x){
return Fa[x] == x ? x : Fa[x] = Find(Fa[x]);
} IL void Add(int u, int v){
edge[cnt] = (Edge){v, ft[u]}; ft[u] = cnt++;
edge[cnt] = (Edge){u, ft[v]}; ft[v] = cnt++;
} IL void Dfs(int u){
for(int e = ft[u]; e != -1; e = edge[e].nt){
int v = edge[e].to;
if(!deep[v]){
deep[v] = deep[u] + 1;
fa[v][0] = u;
Dfs(v);
}
}
} IL int LCA(int u, int v){
if(Find(u) != Find(v)) return -1;
if(deep[u] < deep[v]) swap(u, v);
for(int i = 18; i >= 0; i--)
if(deep[fa[u][i]] >= deep[v]) u = fa[u][i];
if(u == v) return w[u];
for(int i = 18; i >= 0; i--)
if(fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
return w[fa[u][0]];
} int main(){
Fill(ft, -1);
num = n = Read(); m = Read();
for(int i = 1; i <= 2 * n; i++)
Fa[i] = i;
for(int i = 1; i <= m; i++)
road[i] = (Kruskal){Read(), Read(), Read()};
sort(road + 1, road + m + 1);
for(int i = 1, tot = 0; i <= m && tot < n; i++){
int u = Find(road[i].u), v = Find(road[i].v);
if(u != v){
tot++;
w[++num] = road[i].f;
Fa[u] = Fa[v] = num;
Add(u, num); Add(v, num);
}
}
for(int i = num; i; i--)
if(!deep[i]) deep[i] = 1, Dfs(i);
for(int i = 1; i <= 18; i++)
for(int j = 1; j <= num; j++)
fa[j][i] = fa[fa[j][i - 1]][i - 1];
int Q = Read();
while(Q--){
int u = Read(), v = Read();
printf("%d\n", LCA(u, v));
}
return 0;
}

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. [Python Study Notes]CS架构远程访问获取信息--SERVER端v2.0

    更新内容: 1.增加内存信息获取 2.增加电池信息获取 3.增加磁盘信息获取 4.重新布局窗体 5.增加窗体名称 6.增加连接成功之前,不可按压 ''''''''''''''''''''''''''' ...

  2. configure: error: Bundled APR requested but not found at ./srclib/. Download and unpack the corresponding apr and apr-util packages to ./srclib/.

    Apache在2.4版本以后,编译时: # ./configure \ --prefix=/usr/local/apache2 \ --with-included-apr \ --enable-so ...

  3. 通过读取配置文件,启动mongodb

    在实际的项目中,经常利用mongodb数据库做缓存,mongodb的并发性比较高,所以对于快速存储.读取信息有很多优点.在项目中对于第一次的数据请求会直接访问数据库,而对于获得的信息通常都会在此时刻存 ...

  4. ci框架基础知识点

    一.路由 1.index.php/test/hello->控制器test的hello方法 2. 也可以手动配置路由   app/config/routes.php中     I:$route[' ...

  5. 架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)

    本文的案例是基于 架构师入门:搭建基本的Eureka架构(从项目里抽取) 改写的. 在上文里,我们演示Eureka客户端调用服务的整个流程,在这部分里我们将在架构上有所改进.大家可以想象下,在上文里案 ...

  6. 使用tdload工具将本地数据导入到Teradata数据库中

    想把本地的数据文件(比如txt.csv)中的数据导入到Teradata虚拟机中的表中.既可以使用Teradata Assistant中的import功能,也可以使用fastload导入,前者的缺点是一 ...

  7. 接口-以PHP为例

    <?php //使用程序模拟现实情况 //使用规范(方法/属性) interface iUSB { public function start(); public function stop() ...

  8. 1×1卷积的用途(Network in Network)

    1×1卷积,又称为Network in Network 如果卷积的输出输入都只是一个平面,那么1x1卷积核并没有什么意义,它是完全不考虑像素与周边其他像素关系. 但卷积的输出输入是长方体,所以1x1卷 ...

  9. 《android开发艺术探索》读书笔记(四)--View工作原理

    接上篇<android开发艺术探索>读书笔记(三) No1: View的三大流程:测量流程.布局流程.绘制流程 No2: ViewRoot对应于ViewRootImpl类,它是连接Wind ...

  10. Linux的软链接和硬链接

    1.Linux链接概念Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接]硬连接指通过索引节点 ...