xsy 2018 【NOIP2013】货车运输
【NOIP2013】货车运输
Description
Input
接下来m行每行3个整数x,y,z,每两个整数之间用一个空格隔开,表示从x号城市到y号城市有一条限重为z的道路。注意:x不等于y,两座城市之间可能有多条道路。
接下来一行有一个整数q,表示有q辆货车需要运货。
接下来q行,每行两个整数x,y之间用一个空格隔开,表示一辆货车需要从x城市运输货物到y城市,注意:x不等于y。
Output
Sample Input
4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3
Sample Output
3
-1
3
HINT
对于30%的数据,1≤n≤1000,1≤m≤10000,1≤q≤1000
对于60%的数据,1≤n≤1000,1≤m≤50000,1≤q≤1000
对于100%的数据,1≤n≤10000,1≤m≤50000,1≤q≤30000,0≤z≤100000
题解思路
首先,如果两点之间某路径上最小的一条边不在该图的最大生成树上,那么在这个图中,一定有一条路径,其中每一条边的值都大于等于那条边的值。
所以只需要求出最大生成树后再用LCA维护最小值即可。
时间复杂度:O(nlogn)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct data{
int x,y,v;
}t[50001],d[20001];
int n,m,s[10001][21],f[10001][21],fa[10001],h[10001],cnt,fx,fy,ans,p[10001],id[10001],x,y;
bool cmp(data a,data b){
return a.v>b.v;
}
int father(int a){
if(fa[a]!=a)fa[a]=father(fa[a]);
return fa[a];
}
void add(int a,int b,int c){
cnt++;
d[cnt].x=b;
d[cnt].y=h[a];
d[cnt].v=c;
h[a]=cnt;
}
void dfs(int a){
for(int i=1;i<=20;i++){
f[a][i]=f[f[a][i-1]][i-1];
s[a][i]=min(s[a][i-1],s[f[a][i-1]][i-1]);
}
for(int i=h[a];i;i=d[i].y){
if(!p[d[i].x]){
p[d[i].x]=p[a]+1;
f[d[i].x][0]=a;
s[d[i].x][0]=d[i].v;
id[d[i].x]=id[a];
dfs(d[i].x);
}
}
}
void lca(int a,int b){
if(p[a]>p[b]){
for(int i=20;i>=0;i--){
if(p[f[a][i]]>=p[b]){
ans=min(ans,s[a][i]);
a=f[a][i];
}
}
}
if(p[a]<p[b]){
for(int i=20;i>=0;i--){
if(p[f[b][i]]>=p[a]){
ans=min(ans,s[b][i]);
b=f[b][i];
}
}
}
for(int i=20;i>=0;i--){
if(f[a][i]!=f[b][i]){
ans=min(ans,s[a][i]);
ans=min(ans,s[b][i]);
a=f[a][i];
b=f[b][i];
}
}
if(a!=b){
ans=min(ans,s[a][0]);
ans=min(ans,s[b][0]);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].v);
for(int i=1;i<=n;i++)fa[i]=i;
sort(t+1,t+m+1,cmp);
for(int i=1;i<=m;i++){
fx=father(t[i].x);
fy=father(t[i].y);
if(fx!=fy){
fa[fx]=fy;
add(t[i].x,t[i].y,t[i].v);
add(t[i].y,t[i].x,t[i].v);
}
}
for(int i=1;i<=n;i++){
if(!id[i]){
p[i]=1;
id[i]=i;
dfs(i);
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
ans=10000000;
scanf("%d%d",&x,&y);
if(id[x]==id[y]){
lca(x,y);
printf("%d\n",ans);
}else printf("-1\n");
}
}
xsy 2018 【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 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多 ...
- [luogu P1967][NOIp2013] 货车运输
题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
随机推荐
- 怎么判断是qq浏览器还是uc浏览器?
这里我画红框的是不正确的,最好的办法就是打印出navigator.userAgent出来.uc浏览器检验是正确的.
- 利用Wireshark抓取并分析OpenFlow协议报文
OpenFlow 交换机与控制器交互步骤 1. 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网 ...
- XML 中的 xmlns 等属性的意义
原文:https://blog.csdn.net/lengxiao1993/article/details/77914155 Maven 是一个 java 开发人员很难绕过的构建工具, 因为有众多的开 ...
- Class as decorator in python
Class as decorator in python . https://www.geeksforgeeks.org/class-as-decorator-in-python/ http://co ...
- JFinal-layui极速开发企业应用管理系统
Jfinal-layui 官网:http://www.qinhaisenlin.com/ 项目:https://gitee.com/QinHaiSenLin/Jfinal-layui 介绍 JFina ...
- linux非root用户安装4.0.14版本redis
先到官网https://redis.io/download下安装包,现在最新是5.0.5版本,可惜点击下载后被windows禁了,那就下4版本的,往下看Other versions的Old(4.0), ...
- 数据分析入门——numpy
一.什么是numpy Numpy提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于处理多维数组(矩阵)的库.用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多.本身是 ...
- ABAP DEMO 下拉框
效果展示: *&---------------------------------------------------------------------* *& Report YCX ...
- MyBatis-Spring项目
使用Spring IoC可以有效管理各类Java资源,达到即插即拔功能:通过AOP框架,数据库事务可以委托给Spring处理,消除很大一部分的事务代码,配合MyBatis的高灵活.可配置.可优化SQL ...
- CentOS "libc.so.6: version 'GLIBC_2.14' not found"解决方法,同理'GLIBC_2.15' not found"
出现"libc.so.6: version 'GLIBC_2.14' not found"问题,是由于glibc版本过低,升级glibc即可. 由于CentOS系统RPM源目前gl ...