Kruskal重构树(货车运输)
。。。
和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重构树(货车运输)的更多相关文章
- Luogu P1967 货车运输(Kruskal重构树)
P1967 货车运输 题面 题目描述 \(A\) 国有 \(n\) 座城市,编号从 \(1\) 到 \(n\) ,城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \ ...
- NOIP 2013 提高组 洛谷P1967 货车运输 (Kruskal重构树)
题目: A 国有 nn 座城市,编号从 11 到 nn,城市之间有 mm 条双向道路.每一条道路对车辆都有重量限制,简称限重. 现在有 qq 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情 ...
- 洛谷p1967货车运输(kruskal重构树)
题面 题解中有很多说最优解是kruskal重构树 所以 抽了个早自习看了看这方面的内容 我看的博客 感觉真的挺好使的 首先对于kruskal算法来说 是基于贪心的思想把边权排序用并查集维护是否是在同一 ...
- kruskal重构树学习笔记
\(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal\) 求最小(大)生成树,树上求 \(lca\). 算法详 ...
- Kruskal重构树学习笔记+BZOJ3732 Network
今天学了Kruskal重构树,似乎很有意思的样子~ 先看题面: BZOJ 题目大意:$n$ 个点 $m$ 条无向边的图,$k$ 个询问,每次询问从 $u$ 到 $v$ 的所有路径中,最长的边的最小值. ...
- 【BZOJ】3732: Network【Kruskal重构树】
3732: Network Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2812 Solved: 1363[Submit][Status][Dis ...
- CF1253F Cheap Robot(神奇思路,图论,最短路,最小生成树/Kruskal 重构树/并查集)
神仙题. 先考虑平方级别的暴力怎么做. 明显答案有单调性,先二分 \(c\). 先最短路预处理 \(dis_u\) 表示 \(u\) 到离它最近的充电站的距离(一开始把 \(1\) 到 \(k\) 全 ...
- 水壶-[Kruskal重构树] [解题报告]
水壶 本来从不写针对某题的题解,但因为自己实在是太蠢了,这道题也神TM的恶心,于是就写篇博客纪念一下 H水壶 时间限制 : 50000 MS 空间限制 : 565536 KB 评测说明 : 2s,51 ...
- [bzoj 3732] Network (Kruskal重构树)
kruskal重构树 Description 给你N个点的无向图 (1 <= N <= 15,000),记为:1-N. 图中有M条边 (1 <= M <= 30,000) ,第 ...
- 【BZOJ 3732】 Network Kruskal重构树+倍增LCA
Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT ...
随机推荐
- 如何在Python中从零开始实现随机森林
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 决策树可能会受到高度变异的影响,使得结果对所使用的特定测试数据而言变得脆弱. 根据您的测试数据样本构建多个模型(称为套袋)可以减少这种差异,但是 ...
- python并发编程之多进程(一):进程开启方式&多进程
一,进程的开启方式 利用模块开启进程 from multiprocessing import Process import time,random import os def piao(name): ...
- ubuntu17.10 安装firefox的flash
1. flash下载地址:https://get.adobe.com/flashplayer/ 2. 选择tar.gz for linux 3. 下载后解压tar包.里面有个libflashplaye ...
- handler机制面试
handler面试必问 解析: Android提供了Handler和Looper来满足线程间的通信. Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message E ...
- php-fpm问题
这个问题怎么说呢?之前遇到这个问题内心是奔溃的.因为我压根不知道是哪里出问题啦.不过,在我努力探索下,最终还是解决了问题. so请记住,坚持不一定成功,但放弃一定失败. 简单描述一下问题: 1.本地的 ...
- duilib界面库学习(仿PC微信界面,有服务器,有数据库,可以网络通信)
客户端代码:https://github.com/TTGuoying/duilib_ChatClient 服务器代码:https://github.com/TTGuoying/duilib_ChatS ...
- 项目实战14—ELK 企业内部日志分析系统
一.els.elk 的介绍 1.els,elk els:ElasticSearch,Logstash,Kibana,Beats elk:ElasticSearch,Logstash,Kibana ① ...
- ubuntu下串口编程备忘
弄了一下串口,一个小问题多折腾了下,备忘.软件环境:zl@zhanglong:~$ cat /etc/lsb-release DISTRIB_ID=UbuntuDISTRIB_RELEASE=12.0 ...
- 阿里舆情︱舆情热词分析架构简述(Demo学习)
本节来源于阿里云栖社区,同时正在开发一个舆情平台,其中他们发布了一篇他们所做的分析流程,感觉可以作为案例来学习.文章来源:觉民cloud/云栖社区 平台试用链接:https://prophet.dat ...
- Android(Java)利用findbugs进行代码静态检查
主要介绍利用java静态代码检查工具findbugs进行代码检查,包括其作用.安装.使用.高级功能(远程review和bug同步). 虽然Android提供了Test Project工程以及instr ...