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

先跑一次最大生成树。

树剖维护路径最小边权。

树剖又双叒叕写挂了。

 #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. JS元素的左右移动

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

  2. 十六、CI框架之数据库操作get用法

    一.使用数据库的Get方法读取内容,如下代码: 二.数据库如下: 二.效果如下: 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦, ...

  3. 装WIN7的一点心得

    一.为什么要装WIN7 长久以来个人的习惯,WIN10用不来,总体安装思路是:下官方版,找方法激活 二.安装镜像的来源 这个网上版本五花八门,各种系统网站,但都会有软件捆绑等行为,还有浏览器中强制捆了 ...

  4. 05 GUI UGUI

    在Unity开发过程中,不论是3D还是2D开发都需要大量的UI界面来配合使用,用来达到更好的效果 GUI:在Unity脚本生命周期回调方法OnGUI中实现,每一帧渲染两次,在OnGUI中的GUI界面元 ...

  5. caffe中运行mnist

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

  6. DRF项目之JWT认证方式的简介及使用

    什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点 ...

  7. @Autowired的几个使用细节

    1.使用@Autowired的当前类也必须由spring容器托管(打@Coponent.@Controller.@Service .@repository) 2.不管是public 和  privat ...

  8. 2. 现代 javascript 新语法 及 对象专题

    let , const 和 var javascript 里面的作用域 一个大括号 是一个作用域 {  } var 会 在局部作用定义 被定义时 会提升作用域  如 if 的 {} 就属于 局部作用域 ...

  9. POJ 3660 Cow Contest【Floyd 传递闭包】

    传送门:http://poj.org/problem?id=3660 题意:有n头牛, 给你m对关系.(a, b)表示牛a能打败牛b, 求在给出的这些关系下, 能确定多少头牛的排名. 传递闭包: 关系 ...

  10. 第 36 章 TCP/IP协议基础

    问题一:为什么要有缓存表?为什么表项要有过期时间而不是一直有效 1.参考网址: 1)网络——ARP协议 2)linux arp机制解析 2.解答: 2.1 ARP缓存可以减小广播量,当主机发送一个AR ...