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 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
随机推荐
- 用vue做todolist
<template> <div class="hello"> <div style="height:25px;line-height:25p ...
- redis rehash
rehash 随着操作的不断执行, 哈希表保存的键值对会逐渐地增多或者减少, 为了让哈希表的负载因子(load factor)维持在一个合理的范围之内, 当哈希表保存的键值对数量太多或者太少时, 程序 ...
- Thingsboard 重新启动docker-compose容器基础数据存在的问题
在重启了thingsboard的容器后,想再次重新启动容器,发现已经出现了错误 查看posttres中,持久化的地址是tb-node/postgres中 再查看相应的文件夹 删除以上log和postg ...
- [转] Filezilla server设置指南及中文乱码、登录欢迎语问题解决
一.filezilla server 安装指南:FileZilla是一款免费而且开源的FTP工具.包括FileZilla Client,FileZilla Server两个版本.FileZilla S ...
- Geometry and Appearances【转】
https://github.com/AnalyticalGraphicsInc/cesium/wiki/Geometry-and-Appearances Geometry and Appearanc ...
- super与this的用法
1 super和this都是调用其他的构造方法 super放在构造方法的第一条语句,调用父类的某种构造方法,如果没有super语句,会默认调用父类中无参的构造方法,如果父类构造方法指明而且都有参数,子 ...
- 获取div下的input type为file的所有对象
var files = $(".profile-content").find("input[type='file']"); files.each(functio ...
- python : takes 0 positional arguments but 1 was given
def 的要加self, https://blog.csdn.net/u010269790/article/details/78834410
- blaze advisor模型部署工具
python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...
- Linux 打开文件数
linux设置最大打开文件数 - daiyudong2020的博客 - CSDN博客 https://blog.csdn.net/daiyudong2020/article/details/77828 ...