NOIP 2013 提高组 货车运输
描述
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 提高组 货车运输相关推荐
- [NOIP 2013提高组]转圈游戏 题解
这题在洛谷上是道黄题,即[普及/提高-] 所以虽然是提高组的,但是其实挺简单的. 我们来看下题面: [NOIP 2013]转圈游戏 刚看到题面作为一个蒟蒻感觉它都不配做黄题,但是直到我看清楚了后发现它 ...
- 火车运输[NOIP 2013 提高组 Day 1]
https://vijos.org/p/1843 本题 kruskal+倍增lca WA了三次 T_T 总结出一些注意事项: 1. 一定要想明白每一部分是求最大值还是最小值!!!(WA 1) 2. 注 ...
- NOIP 2013 提高组初赛 青蛙跳荷叶
现有一只青蛙,初始时在 n 号荷叶上.当它某一时刻在 k 号荷叶上时,下一时刻将等概 率地随机跳到 1, 2, -, k 号荷叶之一上,直至跳到 1 号荷叶为止.当 n = 2 时,平均一共 跳 2 ...
- NOIP 2018提高组复赛C/C++试题及答案详解
NOIP 2018提高组历年真题 CCF NOIP2018 初赛提高组 C++语言试题 第 1 页,共9 页 第二十四届全国青少年信息学奥林匹克联赛初赛 提高组 C++语言试题 竞赛时间:2018 年 ...
- NOIP 2008 提高组 复赛 message 传字条
NOIP 2008 提高组 复赛 message 传字条 1.样例很快模拟成功,但感觉是凑出来的,没有章法. 2.深度优先遍历,但感觉容易超时. 3.动态规划?翻看他人代码,发现动态规划的写法,确实想 ...
- NOIP 2015 提高组 初赛
NOIP 2015 提高组 初赛 疑难点 学习 感悟. 一. 3. 示例如下(来自自个的理解): 101.101 十进制 转十进制1*10^2+0*10^1+1*10^0+1*10^-1+0*10^- ...
- NOIP 2017 提高组 初赛
NOIP 2017 提高组 初赛 做题感悟. 五.完善程序,是本张试卷最简单的题目,两道题做完,大约花了10分钟.2017-10-17 18:25 对了答案,破天荒,全对. 1.(大整数除法) 有如下 ...
- NOIP 2016 提高组 初赛
NOIP 2016 提高组 初赛 疑难点 学习 感悟. 一. 2.该题81容易看成81次按键,实际是屏幕上出现的第81个字符,实际按键次数超过81次. 3.异或,相同位上,数字相同取0,数字不同取1, ...
- P1066 2^k进制数 NOIP 2006 提高组 第四题
洛谷蓝题(点击跳转) 提高组 第四题 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的 ...
最新文章
- Micropython TPYBoard v102 自动浇花实验
- 3.13. Notepad++中Windows,Unix,Mac三种格式之间的转换
- android异步线程未执行,关于多线程:当服务在后台运行时,Android异步任务无法正常运行(doInBackground未执行)...
- 基于事件的异步模式——BackgroundWorker
- JAVA ReentrantLock 分析
- javaweb mysql 连接池 c3p0 配置_JavaWeb基础—数据库连接池DBCP、C3P0
- RabbitMQ管理界面简述_入门试炼_第3篇
- vue 初始化请求例子_Vue实例初始化
- Python数据分析四剑客:IPython、Numpy、pandas、Matplotlib
- PostgreSQL概述
- Machine Learning and Data Science 教授大师
- Kitti数据测试_视觉/IMU/LiDAR融合
- 谈谈Linux下动态库查找路径的问题
- 【HTML超浪漫的表白网页代码】不会编程也能制作送给女朋友的表白网站
- 关于富文本编辑器froala editor和百度Ueditor使用问题
- excel数据分析 - 13个图表可视化技巧
- Kattis- 3D Printed Statues
- 子线程与主线程之间的通信
- 属性的遍历:for...in 循环
- 赛尔号找不到服务器ip,赛尔号互通版