NOIP2013D1T3货车运输 (生成树+树链剖分)
给出一个图,询问图上两点间路径上最小边权的最大值。
先跑一次最大生成树。
树剖维护路径最小边权。
树剖又双叒叕写挂了。
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cctype>
#define foru(i,x,y) for(int i=x;i<=y;i++)
#define mm(a) memset(a,0,sizeof(a))
#define ford(i,x,y) for(int i=x;i>=y;i--)
#define re(x) x=read()
using namespace std;
typedef long long LL;
typedef double db;
const int inf=1e9;
const int N=2e5+; struct dat{int f,t,w;}a[N],b[N];
struct edge{int to,nxt,w;}e[N];
int head[N],top[N],f[N],F[N],siz[N],t[N*],son[N],d[N],id[N],ne,nb,n,m,cnt; int read(){
static int f,x;static char ch;
x=f=;ch=getchar();
while(!isdigit(ch)){f=(ch=='-');ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return f?-x:x;
} bool cmp(dat a,dat b){
return a.w>b.w;
} int gf(int a){
if(a==F[a])return a;
return F[a]=gf(F[a]);
} void add(int a,int b,int c){
e[++ne]=(edge){b,head[a],c};head[a]=ne;
e[++ne]=(edge){a,head[b],c};head[b]=ne;
} void dfs(int k,int fa){
f[k]=fa;siz[k]=;
for(int i=head[k];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa)continue;
d[v]=d[k]+;
dfs(v,k);
siz[k]+=siz[v];
if(siz[v]>siz[son[k]])son[k]=v;
}
} void build(int k,int tp){
id[k]=++cnt;top[k]=tp;
if(son[k])build(son[k],tp);
for(int i=head[k];i;i=e[i].nxt){
int v=e[i].to;
if(v==f[k])continue;
if(v!=son[k])build(v,v);
}
} #define mid ((L+R)>>1)
#define ls (k<<1)
#define rs (k<<1|1) void upd(int k,int L,int R,int p,int x){
if(p<L||p>R)return;
if(L==R){t[k]=x;return;}
upd(ls,L,mid,p,x);upd(rs,mid+,R,p,x);
t[k]=min(t[ls],t[rs]);
} int quiry(int k,int L,int R,int l,int r){
if(r<L||l>R)return inf;
if(l<=L&&R<=r)return t[k];
return min(quiry(ls,L,mid,l,r),quiry(rs,mid+,R,l,r));
} int find(int a,int b){
int ret=inf;
while(top[a]!=top[b]){
if(d[top[a]]<d[top[b]])swap(a,b);
//又写成了(d[a]<d[b])
int tmp=quiry(,,cnt,id[top[a]],id[a]);
ret=min(ret,tmp);
a=f[top[a]];
}
if(d[a]<d[b])swap(a,b);
if(a!=b)ret=min(ret,quiry(,,cnt,id[b]+,id[a]));
return ret;
} int main(){
scanf("%d%d",&n,&m);
foru(i,,m){re(a[i].f);re(a[i].t);re(a[i].w);F[i]=i;}
sort(a+,a++m,cmp);
foru(i,,m){
int f1=gf(a[i].f),f2=gf(a[i].t);
if(f1!=f2){
F[f2]=f1;
add(a[i].f,a[i].t,a[i].w);
b[++nb]=a[i];
}
}
mm(f);m=n-;
dfs(,);
build(,);
foru(i,,cnt)upd(,,cnt,i,inf);
foru(i,,nb){
if(d[b[i].f]<d[b[i].t])swap(b[i].f,b[i].t);
upd(,,cnt,id[b[i].f],b[i].w);
}
int q=read(),u,v;
while(q--){
re(u);re(v);
if(gf(u)!=gf(v)){puts("-1");continue;}
printf("%d\n",find(u,v));
}
return ;
}
NOIP2013D1T3货车运输 (生成树+树链剖分)的更多相关文章
- NOIP 2015 BZOJ 4326 运输计划 (树链剖分+二分)
Description 公元 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− 条双向航道,每条航道建立在两个星球之间,这 n− 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司, ...
- 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 703 Solved: 461[Submit][Status] ...
- 【SCOI2013】摩托车交易 - 最大生成树+树链剖分
题目描述 mzry1992 在打完吊针出院之后,买了辆新摩托车,开始了在周边城市的黄金运送生意.在mzry1992 生活的地方,城市之间是用双向高速公路连接的.另外,每条高速公路有一个载重上限,即在不 ...
- NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】
NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...
- luogu题解P1967货车运输--树链剖分
题目链接 https://www.luogu.org/problemnew/show/P1967 分析 NOIp的一道裸题,直接在最大生成树上剖分取最小值一下就完事了,非常好写,常数也比较小,然而题解 ...
- BZOJ_4326_[NOIP2015]_运输计划_(二分+LCA_树链剖分/Tarjan+差分)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4326 给出一棵带有边权的树,以及一系列任务,任务是从树上的u点走到v点,代价为u到v路径上的权 ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分
2109. [NOIP 2015] 运输计划 ★★★☆ 输入文件:transport.in 输出文件:transport.out 简单对比时间限制:3 s 内存限制:256 MB [题 ...
- bzoj 4326: NOIP2015 运输计划(二分+树链剖分)
传送门 题解: 树链剖分快速求解任意两点间的路径的权值和: 然后,二分答案: 此题的难点是如何快速求解重合路径? 差分数组可以否??? 在此之前先介绍一下相关变量: int fa[maxn]; int ...
随机推荐
- JS元素的左右移动
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 十六、CI框架之数据库操作get用法
一.使用数据库的Get方法读取内容,如下代码: 二.数据库如下: 二.效果如下: 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦, ...
- 装WIN7的一点心得
一.为什么要装WIN7 长久以来个人的习惯,WIN10用不来,总体安装思路是:下官方版,找方法激活 二.安装镜像的来源 这个网上版本五花八门,各种系统网站,但都会有软件捆绑等行为,还有浏览器中强制捆了 ...
- 05 GUI UGUI
在Unity开发过程中,不论是3D还是2D开发都需要大量的UI界面来配合使用,用来达到更好的效果 GUI:在Unity脚本生命周期回调方法OnGUI中实现,每一帧渲染两次,在OnGUI中的GUI界面元 ...
- caffe中运行mnist
mnist样本字库嘚图片转换:# coding=utf-8import numpy as npimport struct import matplotlib.pyplot as plt from PI ...
- DRF项目之JWT认证方式的简介及使用
什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...
- @Autowired的几个使用细节
1.使用@Autowired的当前类也必须由spring容器托管(打@Coponent.@Controller.@Service .@repository) 2.不管是public 和 privat ...
- 2. 现代 javascript 新语法 及 对象专题
let , const 和 var javascript 里面的作用域 一个大括号 是一个作用域 { } var 会 在局部作用定义 被定义时 会提升作用域 如 if 的 {} 就属于 局部作用域 ...
- POJ 3660 Cow Contest【Floyd 传递闭包】
传送门:http://poj.org/problem?id=3660 题意:有n头牛, 给你m对关系.(a, b)表示牛a能打败牛b, 求在给出的这些关系下, 能确定多少头牛的排名. 传递闭包: 关系 ...
- 第 36 章 TCP/IP协议基础
问题一:为什么要有缓存表?为什么表项要有过期时间而不是一直有效 1.参考网址: 1)网络——ARP协议 2)linux arp机制解析 2.解答: 2.1 ARP缓存可以减小广播量,当主机发送一个AR ...