【NOIP2013】货车运输

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

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】货车运输的更多相关文章

  1. [Luogu 1967] NOIP2013 货车运输

    [Luogu 1967] NOIP2013 货车运输 一年多前令我十分头大的老题终于可以随手切掉了- 然而我这码风又变毒瘤了,我也很绝望. 看着一年前不带类不加空格不空行的清纯码风啊,时光也好像回去了 ...

  2. NOIP2013 货车运输(最大生成树,倍增)

    NOIP2013 货车运输(最大生成树,倍增) A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道 ...

  3. NOIP2013 货车运输 (最大生成树+树上倍增LCA)

    死磕一道题,中间发现倍增还是掌握的不熟 ,而且深刻理解:SB错误毁一生,憋了近2个小时才调对,不过还好一遍AC省了更多的事,不然我一定会疯掉的... 3287 货车运输 2013年NOIP全国联赛提高 ...

  4. NOIP2013 货车运输

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

  5. Codevs3278[NOIP2013]货车运输

    3287 货车运输 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond      题目描述 Description A 国有 ...

  6. 【洛谷P1967】[NOIP2013]货车运输

    货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...

  7. noip2013货车运输

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

  8. NOIP2013货车运输[lca&&kruskal]

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

  9. [noip2013]货车运输(kruskal + 树上倍增)

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

  10. [luogu P1967][NOIp2013] 货车运输

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

随机推荐

  1. Linux文件与文件夹的权限问题

    0x01 修改文件可读写属性的方法 例如:把index.htm 文件修改为可写可读可执行: chmod 777 index.htm 要修改目录下所有文件属性可写可读可执行: chmod 777 *.* ...

  2. encode(编码)和decode(解码)方法

    JS对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1 ...

  3. Oracle语法 及 SQL题目(三)

    目录 SQL题目六 第一个问题思路(查询酒类商品的总点击量) 第二个问题思路(查询每个类别所属商品的总点击量,并按降序排列) 第三个问题思路(查询所有类别中最热门的品种(点击量最高),并按点击量降顺序 ...

  4. C排序算法

    几个常用的排序算法:插入排序.快速排序.归并排序 #include <stdio.h> #include <stdlib.h> #include <stdbool.h&g ...

  5. php 将office文件(word/excel/ppt)转化为pdf(windows和linux只要安装对应组件应该就行)

    一.配置环境 (1)配置php.ini 添加:extension=php_com_dotnet.dll com.allow_dcom = true  // 去掉号,改为true 重启环境 (2) 安装 ...

  6. 怎么设置cookie,怎么设置cookie以及删除cookie和cookie详解

    在操作cookie之前,先来看一下cookie长什么样. 可以看到,cookie是一个个键值对(“键=值”的形式)加上分号空格隔开组合而成, 形如: "name1=value1; name2 ...

  7. Nutch、Scrapy、Lucene、Heritrix、Solr、Sphinx

    Nutch.Scrapy.Lucene.Heritrix.Solr.Sphinx

  8. etcd常用命令记录

    etcd常用命令记录   1.查看etcd的版本 [root@etcd01 ssl]# curl -L http://127.0.0.1:2379/version {"etcdserver& ...

  9. postgre级联更新

    常规写法 update t_table_copy a set content=( select content from t_table b where a.id = b.id ); 这些法,数据少了 ...

  10. python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...