bzoj3732 Network(NOIP2013 货车运输)
Description
给你N个点的无向图 (1 <= N <= 15,000),记为:1…N。
图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 < = d_j < = 1,000,000,000).
现在有 K个询问 (1 < = K < = 20,000)。
每个询问的格式是:A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?
Input
第一行: N, M, K。
第2..M+1行: 三个正整数:X, Y, and D (1 <= X <=N; 1 <= Y <= N). 表示X与Y之间有一条长度为D的边。
第M+2..M+K+1行: 每行两个整数A B,表示询问从A点走到B点的所有路径中,最长的边最小值是多少?
Output
对每个询问,输出最长的边最小值是多少。
Sample Input
1 2 5
2 3 4
3 4 3
1 4 8
2 5 7
4 6 2
1 2
1 3
1 4
2 3
2 4
5 1
6 2
6 1
Sample Output
5
5
4
4
7
4
5
HINT
1 <= N <= 15,000
1 <= M <= 30,000
1 <= d_j <= 1,000,000,000
1 <= K <= 15,000
最小生成树+倍增求lca
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=15000+10,maxm=30000+10;
int n,m,k,faf[maxn],tot;
struct Node{
int x,y,d;
bool operator <(const Node& b) const{return d<b.d;}
}node[maxm];
int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
}
int find(int x) {
return faf[x]==x? x:faf[x]=find(faf[x]);
}
int fir[maxn],to[2*maxn],nxt[2*maxn],val[2*maxn],e=0;
void add(int x,int y,int z) {
to[++e]=y;nxt[e]=fir[x];fir[x]=e;val[e]=z;
to[++e]=x;nxt[e]=fir[y];fir[y]=e;val[e]=z;
}
int dep[maxn],fa[maxn][20],ans[maxn][20];
void dfs(int pos,int h) {
dep[pos]=h;
for(int y=fir[pos];y;y=nxt[y]) {
if(to[y]==fa[pos][0]) continue;
fa[to[y]][0]=pos;
ans[to[y]][0]=val[y];
dfs(to[y],h+1);
}
}
int mi[20],cha,rs;
int LCA(int x,int y) {
rs=1;
if(dep[x]!=dep[y]) {
if(dep[x]<dep[y]) swap(x,y);
cha=dep[x]-dep[y];
for(int i=tot;i>=0;--i) if(cha>=mi[i]) {
rs=max(rs,ans[x][i]);
cha-=mi[i]; x=fa[x][i];
if(!cha) break;
}
}
int xx,yy,d;
while(x!=y) {
xx=x;yy=y;d=-1;
while(xx!=yy) {
if(d>=0) rs=max(rs,ans[x][d]),rs=max(rs,ans[y][d]);
x=xx;y=yy;
xx=fa[x][++d]; yy=fa[y][d];
}
if(d==0) rs=max(rs,ans[x][d]),rs=max(rs,ans[y][d]),x=xx,y=yy;
}
return rs;
}
int main() {
n=read();m=read();k=read();
int a,b;
for(int i=1;i<=m;++i) {
node[i].x=read();node[i].y=read();node[i].d=read();
}
sort(node+1,node+m+1);
for(int i=1;i<=n;++i) faf[i]=i;
for(int i=1;i<=m;++i) {
a=find(node[i].x);b=find(node[i].y);
if(a!=b) {
faf[a]=b;tot++;
add(node[i].x,node[i].y,node[i].d);
}
if(tot==n-1) break;
}
dfs(1,1); tot=-1;
for(int i=1;i<n*2;i<<=1) mi[++tot]=i;
for(int i=1;i<=tot;++i) for(int j=1;j<=n;++j) {
fa[j][i]=fa[fa[j][i-1]][i-1];
ans[j][i]=max(ans[j][i-1],ans[fa[j][i-1]][i-1]);
}
for(int i=1;i<=k;++i) {
a=read();b=read();
printf("%d\n",LCA(a,b));
}
return 0;
}
bzoj3732 Network(NOIP2013 货车运输)的更多相关文章
- [Luogu 1967] NOIP2013 货车运输
[Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...
- NOIP2013 货车运输(最大生成树,倍增)
NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...
- NOIP2013 货车运输 (最大生成树+树上倍增LCA)
死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...
- NOIP2013 货车运输
3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货 ...
- Codevs3278[NOIP2013]货车运输
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 ...
- 【洛谷P1967】[NOIP2013]货车运输
货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...
- noip2013货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- NOIP2013货车运输[lca&&kruskal]
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
- [noip2013]货车运输(kruskal + 树上倍增)
描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...
随机推荐
- 《DSP using MATLAB》Problem 7.33
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- dom4j和document
DOM的优点和缺点: 优点:DOM操作思维清晰,简单 缺点:在操作大量数据的时候性能,不能保证 DOM(Document Object Model) // 表示出需要被操作的XML文件的路径,注意是文 ...
- Python - 基本数据类型及其常用的方法之列表
列表: 特点:用 [] 括起来,切元素用逗号分隔:列表内的元素可以为任何的数据类型. 列表的基本操作: 1.修改 li = [12, 5, 6, ["Aiden", [2, 4], ...
- 跟我一起写一个chrome扩展程序
在我没有看这本书之前,我都想象不到,原来chrome扩展程序可以这样写,真的非常有意思. 就是用最简单最基础的代码,然后就实现了一些非常有意思的玩意儿. 先看效果图 实际运用要和现实联系在一起,经历和 ...
- 如何在 Flink 1.9 中使用 Hive?
Apache Flink 从 1.9.0 版本开始增加了与 Hive 集成的功能,用户可以通过 Flink 来访问 Hive 的元数据,以及读写 Hive 中的表.本文将主要从项目的设计架构.最新进展 ...
- CSS作业问题 内容回顾
CSS作业问题 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- angular1.0 $http jsonp callback
$http.jsonp(sDUrl,{cache:false,jsonpCallbackParam:'callback'}); https://stackoverflow.com/questions/ ...
- mysql查询某个字段并修改
比如我存储的数据,有的是 山东,有的是山东省 我想统一改为山东省 UPDATE t_security SET province = REPLACE( province, '山东', '山东省' ) W ...
- Binder对象死亡通知机制
本文參考<Android系统源码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码: ~/Android/frameworks/base/libs/bin ...
- windows 环境下搭建docker私有仓库
windows 环境下搭建docker私有仓库 1.在公用仓库中pull仓库镜像 docker pull regitry 2.启动仓库镜像 //-d意思是后台运行,-p是做端口映射,这里是将本地的50 ...