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

先跑一次最大生成树。

树剖维护路径最小边权。

树剖又双叒叕写挂了。

 #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. 浪潮服务器raid5-echo转义说明

    https://jingyan.baidu.com/article/4ae03de3e4c8d33eff9e6bee.html https://wenku.baidu.com/view/3c5dc9a ...

  2. linux服务重启命令

    /etc/init.d/sshd restart/etc/init.d/sshd reload systemctl status sshd.servicesystemctl restart sshd. ...

  3. 一天一个设计模式——模板方法(Template Method)模式

    一.模式说明 现实世界中的模板是用于将事物的结构规律予以固定化.标准化的成果,它体现了结构形式的标准化.例如镂空文字印刷的模板,通过某个模板印刷出来的文字字体大小都是一模一样,但是具体使用什么材质的颜 ...

  4. POJ 1459:Power Network 能源网络

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 25414   Accepted: 13247 D ...

  5. POJ 1663:Number Steps

    Number Steps Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13664   Accepted: 7378 Des ...

  6. 文献阅读报告 - Pedestrian Trajectory Prediction With Learning-based Approaches A Comparative Study

    概述 本文献是一篇文献综述,以自动驾驶载具对外围物体行动轨迹的预测为切入点,介绍了基于运动学(kinematics-based)和基于机器学习(learning-based)的两大类预测方法. 并选择 ...

  7. 【十日冲刺计划】第一日 星遇Sprint1计划会议成果

    ——小组成员 赵剑峰 张傲 周龙海 Sprint 计划会议1:定出 Sprint 目标和既定产品Backlog. 会议进程(1小时) • 首先对sprint目标进行总体介绍,概括星遇的backlog, ...

  8. Object arrays cannot be loaded when allow_pickle=False

    问题再现 代码是Deep Learning with Python中的: from keras.datasets import imdb (train_data, train_labels), (te ...

  9. shell中获取文件目录方法

    1.``:表示执行对应的命令,嵌套时使用`\`\``,注意\进行转义,同时执行多个命令时使用:隔开file=`cd "\`dirname $0\`";pwd`echo $file ...

  10. App的工程框架

    对于我刚下载的Android studio,来说一说它的框架结构  Project项目结构: .gradle:Gradle编译系统,版本由wrapper指定 .idea:IDE所需要的文件 .app: ...