给出一个图,询问图上两点间路径上最小边权的最大值。

先跑一次最大生成树。

树剖维护路径最小边权。

树剖又双叒叕写挂了。

 #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货车运输 (生成树+树链剖分)的更多相关文章

  1. NOIP 2015 BZOJ 4326 运输计划 (树链剖分+二分)

    Description 公元 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n− 条双向航道,每条航道建立在两个星球之间,这 n− 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司, ...

  2. 【BZOJ-4326】运输计划 树链剖分 + 树上差分 + 二分

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 703  Solved: 461[Submit][Status] ...

  3. 【SCOI2013】摩托车交易 - 最大生成树+树链剖分

    题目描述 mzry1992 在打完吊针出院之后,买了辆新摩托车,开始了在周边城市的黄金运送生意.在mzry1992 生活的地方,城市之间是用双向高速公路连接的.另外,每条高速公路有一个载重上限,即在不 ...

  4. NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】

    NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...

  5. luogu题解P1967货车运输--树链剖分

    题目链接 https://www.luogu.org/problemnew/show/P1967 分析 NOIp的一道裸题,直接在最大生成树上剖分取最小值一下就完事了,非常好写,常数也比较小,然而题解 ...

  6. BZOJ_4326_[NOIP2015]_运输计划_(二分+LCA_树链剖分/Tarjan+差分)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4326 给出一棵带有边权的树,以及一系列任务,任务是从树上的u点走到v点,代价为u到v路径上的权 ...

  7. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  8. cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分

    2109. [NOIP 2015] 运输计划 ★★★☆   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:3 s   内存限制:256 MB [题 ...

  9. bzoj 4326: NOIP2015 运输计划(二分+树链剖分)

    传送门 题解: 树链剖分快速求解任意两点间的路径的权值和: 然后,二分答案: 此题的难点是如何快速求解重合路径? 差分数组可以否??? 在此之前先介绍一下相关变量: int fa[maxn]; int ...

随机推荐

  1. HZNU-ACM寒假集训Day8小结 最小生成树

    最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络   https://www.luogu.com.cn/problem/P1546 #i ...

  2. 吴裕雄--天生自然 JAVASCRIPT开发学习:while 循环

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. spring boot集成mybatis(3) - mybatis generator 配置

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  4. 2020/1/31 PHP代码审计之文件包含漏洞

    0x00 文件包含简介 文件包含漏洞的产生原因是在通过引入文件时,引用的文件名,用户可控,由于传入的文件名没有经过合理的校检,或者校验被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意 ...

  5. caffe中运行mnist

    mnist样本字库嘚图片转换:# coding=utf-8import numpy as npimport struct import matplotlib.pyplot as plt from PI ...

  6. 18 12 18 给服务器添加logging 日志功能

    Python中有个logging模块可以完成相关信息的记录,在debug时用它往往事半功倍 1. 日志级别 日志一共分成5个等级,从低到高分别是: DEBUG INFO WARNING ERROR C ...

  7. ping内网服务器

    cat ping.sh#!/bin/baship="192.168.1."lastip=(200201202210211212220221222) #ip列表 可以继续添加 ps ...

  8. Dlib笔记一:基本数据结构和基本操作

    编译了Dlib之后就开始想着怎么用起来,先从基本的数据类型说起吧,因为是图像,所以难免会跟OpenCV的数据类型比较.在Dlib中,图像是用二维阵列(array2d)或者矩阵(matrix)来表示的, ...

  9. Mdb文件工具类,UCanAccess使用,Access数据库操作

    ================================ ©Copyright 蕃薯耀 2020-01-09 https://www.cnblogs.com/fanshuyao/ 使用Ocbc ...

  10. springboot rabbitmq消息同步用作接口调用

    1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...