Description

A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。

Input

第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路。

接下来 m 行每行 3 个整数 x、y、z,每两个整数之间用一个空格隔开,表示从 x 号城市到 y 号城市有一条限重为 z 的道路。注意:x 不等于 y,两座城市之间可能有多条道路。

接下来一行有一个整数 q,表示有 q 辆货车需要运货。

接下来 q 行,每行两个整数 x、y,之间用一个空格隔开,表示一辆货车需要从 x 城市运输货物到 y 城市,注意:x 不等于 y。

Output

输出共有 q 行,每行一个整数,表示对于每一辆货车,它的最大载重是多少。如果货车不能到达目的地,输出-1。

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

Data Constraint

对于 30%的数据,0 < n < 1,000,0 < m < 10,000,0 < q < 1,000;

对于 60%的数据,0 < n < 1,000,0 < m < 50,000,0 < q < 1,000;

对于 100%的数据,0 < n < 10,000,0 < m < 50,000,0 < q < 30,000,0 ≤ z ≤ 100,000。

 
做法:最大生成树+RMQ+LCA
 #include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#define N 50007
using namespace std;
int n,m,Q,ans;
int ls[N],tot,f[N],dep[N];
int fa[N/][],dis[N/][];
struct edge{
int to,next;
int w;
}e[N];
struct arr{
int x,y;
int w;
}a[N]; int Cmp(arr a,arr b){
return a.w>b.w;
} void Init(){
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
sort(a+,a+m+,Cmp);
} int Find(int x){
if (f[x]==x) return x;
return f[x]=Find(f[x]);
} void Add(int x,int y,int z){
e[++tot].to=y;
e[tot].next=ls[x];
e[tot].w=z;
ls[x]=tot;
} void Mst(){
memset(dis,0x7f7f7f7f,sizeof(dis));
for (int i=;i<=n;i++) f[i]=i;
for (int i=;i<=m;i++){
int u=a[i].x,v=a[i].y;
int q=Find(u), p=Find(v);
if (q!=p){
Add(u,v,a[i].w);
Add(v,u,a[i].w);
f[q]=p;
}
}
} void Dfs(int x,int pre){
fa[x][]=pre;
dep[x]=dep[pre]+;
for (int i=ls[x];i;i=e[i].next){
int v=e[i].to;
if (v==pre) continue;
dis[v][]=e[i].w;
Dfs(v,x);
}
} void Lca(int x,int y){
if (dep[x]<dep[y]) swap(x,y);
for (int i=;i>=;i--)
if (dep[fa[x][i]]>=dep[y]){
ans=min(ans,dis[x][i]);
x=fa[x][i];
}
if (x==y) return;
for (int i=;i>=;i--)
if (fa[x][i]!=fa[y][i]){
ans=min(ans,min(dis[x][i],dis[y][i]));
x=fa[x][i],y=fa[y][i];
}
ans=min(ans,min(dis[x][],dis[y][]));
} void Work(){
scanf("%d",&Q);
while (Q--){
int x,y;
scanf("%d%d",&x,&y);
if (Find(x)!=Find(y)){
printf("-1\n");
continue;
}
else{
ans=0x7f7f7f7f;
Lca(x,y);
printf("%d\n",ans);
}
}
} int main(){
Init();
Mst();
Dfs(,);
for (int j=;j<=;j++)
for (int i=;i<=n;i++){
fa[i][j]=fa[fa[i][j-]][j-];
dis[i][j]=min(dis[i][j-],dis[fa[i][j-]][j-]);
} Work();
}

JZOJ 3534. 【NOIP2013提高组day1】货车运输的更多相关文章

  1. 【NOIP2013提高组】货车运输

    货车运输  (truck.cpp/c/pas) [问题描述]  A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有q辆货车在运输货物,司机们想知道每辆 ...

  2. 洛谷P1967 [NOIP2013提高组Day1T2]货车运输

    P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...

  3. NOIP2013 提高组 Day1

    https://www.luogu.org/problem/lists?name=&orderitem=pid&tag=83%7C30 期望得分:100+100+100=300 实际得 ...

  4. NOIP提高组 2013货车运输

    觉得题目水的离开 不屑的大佬请离开 不会图论的请离开 ……. 感谢您贡献的访问量 ————————————华丽的分割线———————————— 题面: 题目描述 A 国有 n 座城市,编号从 1 到 ...

  5. noip2013提高组day1第一题-转圈游戏——快速幂典型应用

    所谓的快速幂: // 计算 m^n % k 的快速幂算法 int quickpow(int m,int n,int k) { ; ) { ) b = (b*m)%k; n = n >> ; ...

  6. 【NOIP】提高组2013 货车运输

    [算法]最大生成树+LCA(倍增) [题解]两点间选择一条路径最小值最大的路径,这条路径一定在最大生成树上,因为最大生成树就是从边权最大的边开始加的. 先求原图的最大生成树(森林),重新构图,然后用一 ...

  7. 题解 【luoguP1967 NOIp提高组2013 货车运输】

    题目链接 题解 题意 给你一个无向图,求两个点之间的一条路径,使路径上的最小值最大 算法:Kruskal最大生成树+倍增lca 分析 首先容易知道,答案一定在该图的最大生成树上 之后问题便转换成了树上 ...

  8. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  9. [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路

    [NOIp2013提高组]积木大赛/[NOIp2018提高组]铺设道路 题目大意: 对于长度为\(n(n\le10^5)\)的非负数列\(A\),每次可以选取一个区间\(-1\).问将数列清零至少需要 ...

随机推荐

  1. 1064. 计算斐波那契第n项 通项公式

    题目描述 输入n,编写程序输出斐波那契数列的第n项.其中斐波那契数列f(n)的定义如下: f(1)=0,f(2)=1         f(n)=f(n-1)+f(n-2)(n>=2) 输入 一行 ...

  2. Design Pattern ->Abstract Factory

    Layering & Contract Philosophy With additional indirection Abstract Factory //The example code i ...

  3. Lucene——索引过程分析Index

    Lucene索引过程分为3个主要操作步骤:将原始文档转换成文本.分析文本.将分析好的文本保存至索引中 一.提取文本和创建文档 从 pdf.word等非纯文本格式文件中,提取文本格式信息.建立起对应的, ...

  4. Spark job执行流程消息图

    Spark job执行流程消息图 1.介绍

  5. Python基础学习之集合

    集合是一个无序.不重复的数据集合,它的主要作用如下: 去重:把一个列表变成集合,就可以去除重复的内容 关系测试:测试两组数据之间的交集.并集.差集等关系 集合常用的操作: #创建一个数值集合 s=se ...

  6. SINAMICS S120/S120 EPOS 基本定位修改方向

    步骤 修改 P1821 (在线修改需要P10=3) 修改完成,copy ram to rom / load to PG

  7. JavaRebel 2.0 发布,一个JVM插件

    JavaRebel是一个JVM插件(-javaagent),能够即时重载java class更改,因此不需要重新部署一个应用或者重启容器,节约开发者时间. JavaRebel 2.0的新特征: 改变了 ...

  8. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序

    HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不 ...

  9. 四大CPU体系结构ARM、X86/Atom、MIPS、PowerPC

    http://blog.csdn.net/wangjianno2/article/details/52140936 RISC(reduced instruction set computer,精简指令 ...

  10. Gym 100169A 最短路

    题意:不久后滑铁卢将会变得非常冷,但是幸运的是,很多建筑都被桥梁和隧道连接着,所以你不需要总是走在外面.但是现在建筑 物之间的连接是错综复杂的,很难知道某两个建筑物之间的最优路线,所以需要你写程序判断 ...