描述

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

格式

输入格式

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

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

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

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

输出格式

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

样例1

样例输入1

4 3
1 2 4
2 3 3
3 1 1
3
1 3
1 4
1 3

样例输出1

3
-1
3

限制

每个测试点1s。

提示

对于 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。

来源

NOIP 2013 提高组 Day 1

简单说一下本题思路吧。

题目要求每辆车在不超过车辆限重的情况下,最多能运多重的货物

显然有一点点优化,如果两个道路间有多条道路,显然你要让货车走限重最大的道路。

那么大家应该都知道有一个叫最小生成树的克鲁斯卡尔算法吧。 这道题其实一开始要先求一个图的最大生成树,

这样只要车走这些道路,就可以满足限重最大。当然,这棵最大生成树不一定能求出来,因为有的点之间不能相互连通。

那么怎么快速判断两点是否连通呢? 嗯 没错,你可以使用并查集维护,对的对的,最好是带路径压缩的并查集维护,

这样能更快一些。 至于求两点间限重最小值的话,你可以把一号节点作为根节点,建立一棵树,然后对每个点标上等级标记,求这两个点

之间的限重的最小值的话,比较暴力的可以直接模拟往上找两个点的最近公共祖先,可以AC的,聪明的可以去写倍增的LCA,也很强势;

如果不太懂得话可以好好看一下我代码里的work过程,好好看应该很快就能懂,原谅小武不能在这里用语言描述清楚,怪我喽QAQ;

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define MAXN 10005
#define MAXM 100005using namespace std;struct Edge { int from; int to; int val; int next; };int n;
int m;
int q;
int cnt;
int num;
int f[MAXN];
int lv[MAXN];
int vis[MAXN];
int dis[MAXN];
int pre[MAXN];
int head[MAXN];Edge s[MAXM],edge[MAXM];inline bool cmp(Edge x,Edge y) { return x.val>y.val; }inline int find(int x)
{if (f[x]!=x) return f[x]=find(f[x]);return f[x];
}inline void add(int u,int v,int w)
{edge[++cnt].from=u;edge[cnt].to=v;edge[cnt].val=w;edge[cnt].next=head[u];head[u]=cnt; return ;
}inline void dfs(int u)
{for (int i=head[u];i;i=edge[i].next){int v=edge[i].to;if (!vis[v]){pre[v]=u; vis[v]=1; dis[v]=min(dis[v],edge[i].val);lv[v]=lv[u]+1; dfs(v);}} return ;
}inline int work(int x,int y)
{int ans=100005;while(lv[x]>lv[y]) ans=min(ans,dis[x]),x=pre[x];while(lv[y]>lv[x]) ans=min(ans,dis[y]),y=pre[y];while(x!=y) ans=min(ans,min(dis[x],dis[y])),x=pre[x],y=pre[y];return ans;
}inline void solve()
{scanf("%d%d",&n,&m); memset(dis,0x7f,sizeof(dis));for (int i=1;i<=n;i++) f[i]=i;for (int i=1;i<=m;i++)scanf("%d%d%d",&s[i].from,&s[i].to,&s[i].val);sort(s+1,s+1+m,cmp); num=0; cnt=0;for (int i=1;i<=m&&num!=n-1;i++){int fa=find(s[i].from); int fb=find(s[i].to);if (fa!=fb) {f[fa]=fb; num++; add(s[i].from,s[i].to,s[i].val);add(s[i].to,s[i].from,s[i].val);}} scanf("%d",&q); memset(vis,0,sizeof(vis));for (int i=1;i<=n;i++)if (!vis[i]) pre[i]=0,lv[i]=vis[i]=1,dfs(i);for (int i=1;i<=q;i++){int a; int b; scanf("%d%d",&a,&b);int fa=find(a); int fb=find(b);if (fa!=fb) printf("-1\n");else printf("%d\n",work(a,b));} return ;
}int main()
{solve();return 0;
}

NOIP 2013 提高组 货车运输相关推荐

  1. [NOIP 2013提高组]转圈游戏 题解

    这题在洛谷上是道黄题,即[普及/提高-] 所以虽然是提高组的,但是其实挺简单的. 我们来看下题面: [NOIP 2013]转圈游戏 刚看到题面作为一个蒟蒻感觉它都不配做黄题,但是直到我看清楚了后发现它 ...

  2. 火车运输[NOIP 2013 提高组 Day 1]

    https://vijos.org/p/1843 本题 kruskal+倍增lca WA了三次 T_T 总结出一些注意事项: 1. 一定要想明白每一部分是求最大值还是最小值!!!(WA 1) 2. 注 ...

  3. NOIP 2013 提高组初赛 青蛙跳荷叶

    现有一只青蛙,初始时在 n 号荷叶上.当它某一时刻在 k 号荷叶上时,下一时刻将等概 率地随机跳到 1, 2, -, k 号荷叶之一上,直至跳到 1 号荷叶为止.当 n = 2 时,平均一共 跳 2 ...

  4. NOIP 2018提高组复赛C/C++试题及答案详解

    NOIP 2018提高组历年真题 CCF NOIP2018 初赛提高组 C++语言试题 第 1 页,共9 页 第二十四届全国青少年信息学奥林匹克联赛初赛 提高组 C++语言试题 竞赛时间:2018 年 ...

  5. NOIP 2008 提高组 复赛 message 传字条

    NOIP 2008 提高组 复赛 message 传字条 1.样例很快模拟成功,但感觉是凑出来的,没有章法. 2.深度优先遍历,但感觉容易超时. 3.动态规划?翻看他人代码,发现动态规划的写法,确实想 ...

  6. NOIP 2015 提高组 初赛

    NOIP 2015 提高组 初赛 疑难点 学习 感悟. 一. 3. 示例如下(来自自个的理解): 101.101 十进制 转十进制1*10^2+0*10^1+1*10^0+1*10^-1+0*10^- ...

  7. NOIP 2017 提高组 初赛

    NOIP 2017 提高组 初赛 做题感悟. 五.完善程序,是本张试卷最简单的题目,两道题做完,大约花了10分钟.2017-10-17 18:25 对了答案,破天荒,全对. 1.(大整数除法) 有如下 ...

  8. NOIP 2016 提高组 初赛

    NOIP 2016 提高组 初赛 疑难点 学习 感悟. 一. 2.该题81容易看成81次按键,实际是屏幕上出现的第81个字符,实际按键次数超过81次. 3.异或,相同位上,数字相同取0,数字不同取1, ...

  9. P1066 2^k进制数 NOIP 2006 提高组 第四题

    洛谷蓝题(点击跳转) 提高组 第四题 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的 ...

最新文章

  1. Micropython TPYBoard v102 自动浇花实验
  2. 3.13. Notepad++中Windows,Unix,Mac三种格式之间的转换
  3. android异步线程未执行,关于多线程:当服务在后台运行时,Android异步任务无法正常运行(doInBackground未执行)...
  4. 基于事件的异步模式——BackgroundWorker
  5. JAVA ReentrantLock 分析
  6. javaweb mysql 连接池 c3p0 配置_JavaWeb基础—数据库连接池DBCP、C3P0
  7. RabbitMQ管理界面简述_入门试炼_第3篇
  8. vue 初始化请求例子_Vue实例初始化
  9. Python数据分析四剑客:IPython、Numpy、pandas、Matplotlib
  10. PostgreSQL概述
  11. Machine Learning and Data Science 教授大师
  12. Kitti数据测试_视觉/IMU/LiDAR融合
  13. 谈谈Linux下动态库查找路径的问题
  14. 【HTML超浪漫的表白网页代码】不会编程也能制作送给女朋友的表白网站
  15. 关于富文本编辑器froala editor和百度Ueditor使用问题
  16. excel数据分析 - 13个图表可视化技巧
  17. Kattis- 3D Printed Statues
  18. 子线程与主线程之间的通信
  19. 属性的遍历:for...in 循环
  20. 赛尔号找不到服务器ip,赛尔号互通版

热门文章

  1. iOS8测试版可安装第三方输入法,还越狱么?
  2. Matplotlib数据动态可视化
  3. android studio 文件夹改名后 比如 example 改成demo 出现Cannot resolve symbol ‘R
  4. sql添加字段并加备注、默认值
  5. 基于ROS 履带车从零开始制做(2):科普人工智能,无人驾驶
  6. 富士施乐p355d_富士施乐p355d按着选项键开机,选项键是哪个
  7. Js模拟下拉框(select-option)的实现
  8. 朋友圈需求文档撰写示例
  9. oss服务端签名后直传分析与代码实现
  10. Apache服务一简介与安装