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 ...
随机推荐
- Android自定义View——实现字母导航栏
1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 1.先看主布局,方便后面代码的 ...
- 一、VIP课程:互联网工程专题 01-Git基本概念与核心命令掌握
第一课:Git基本概念与核心命令掌握.docx 课程概要: GIT 体系概述 GIT 核心命令使用 GIT 底层原理 一.GIT体系概述 1.使用方式区别 从本地把文件推送远程服务,SVN只需要com ...
- SAP_BASIS常用事务代码
1.SM66:监控当前系统的所有进程: 2.SM50/SM51:监视当前客户端的所有进程: 3.AL08:查看系统当前用户登录情况: 4.ST22:查看系统发生的DUMP: 5.ST03:查看系统当前 ...
- 读取word模板,填充数据后导出
一.需求说明 定期生成word报告,报告中含有文本.表格.图表等元素,依次获取进行替换,保留原有样式,生成新的word文档 二.引入依赖 <dependency> <groupId& ...
- 备份 分区表 mbr
备份方法: 1.备份分区表信息 sudo fdisk -l >hda.txt #分区表信息重定向输出到文件中 2.备份MBR linux@linux-desktop:~/ex$ sudo ...
- MySQL表的几个简单查询语句
1. 创建数据库CREATE DATABASE database-name 2. 删除数据库drop database dbname 3. 创建新表create table tabname(co ...
- python期末考试复习
期末考试复习 补修的python跟着大一一起学,考试肯定不会出难,于是就敲了一些代码,把他们放到博客上,来记录一下 代码都是一段一段的,且python代码不是很多,所以我都写到了一个文件里,作为练习 ...
- c++ 广度优先搜索
#include <iostream> using namespace std; ; ; // >=9皆可 struct node//声明图形顶点结构 { int vertex; s ...
- mysql查询用if控制显示列
1: select *,if(sex=1,”男”,”女”) as sex from user2: select CASE sex WHEN 1 THEN ‘男’ ELSE ‘女’ END as sex ...
- 直击JDD | 京东开启技术服务元年:携手合作伙伴,共创产业未来
11月19日,主题为"突破与裂变"的2019京东全球科技探索者大会(JDDiscovery)在京盛大开幕.京东集团副总裁黎科峰在JDD主论坛做了题为"技术驱动.开放赋能& ...