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 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况下,最多 ...
随机推荐
- SpringMVC从Request域中获取数据
SpringMVC从Request域中获取数据的三种方式 SpringMVC环境自行搭建, 约定存在如下目录和文件:/WEB-INF/pages/success.jsp 方式一:传入Model对象 前 ...
- element ui的table的头部自定义
<el-table-column label="级别" min-width="120" prop="clueLevel" align= ...
- 批量更新表注释 mysql
-- 生成更新语句 SELECT CONCAT( 'ALTER TABLE ', T2.table_name, ' COMMENT ''', T1.TABLE_COMMENT, ''';' ) sql ...
- Shell修改密码为原密码
密码到期后更改密码为原密码,服务器多时工作量巨大,编写脚本完成. 登陆后修改提示符为: doraemon# 方便expect匹配 修改LANG=C,提示为英文防止干扰: #!/usr/bin/expe ...
- Shell脚本——make命令和Makefile文件【转】
https://blog.csdn.net/twc829/article/details/72729799 make命令是一个常用的编译命令,尤其在C/C++开发中,make命令通过makefile文 ...
- linux设备树编译器DTC【转】
本文转载自:https://blog.csdn.net/chenmiaowu88/article/details/54342823 参考文件: \kernel\Documentation\device ...
- springboot前端传参date类型后台处理方式
转载:https://blog.csdn.net/xiangluer/article/details/81913137?utm_source=copy 参考如下博客: https://www.jian ...
- JVM 类加载器命名空间深度解析与实例分析
一.创建Sample 1.创建实例 public class MyPerson { private MyPerson myPerson; public void setMyPerson(Object ...
- pt-table-checksum解读【转】
pt-table-checksum是目前可以说是最好的查看主从一致性的工具 先来个使用例子,有助快速上手使用 在主库执行: mysql>GRANT SELECT, PROCESS, SUPER, ...
- CopyOnWrite 思想在 Kafka 源码中的运用
CopyOnWrite 思想在 Kafka 源码中的运用 在 Kafka 的内核源码中,有这么一个场景,客户端在向 Kafka 写数据的时候,会把消息先写入客户端本地的内存缓冲,然后在内存缓冲里形成一 ...