[洛谷P1967][题解]货车运输
这道题让我们求最小限重的最大值
显然可以先求出最大生成树,然后在树上进行操作
因为如果两点之间有多条路径的话一定会走最大的,而其他小的路径是不会被走的
然后考虑求最小权值
可以采用倍增求LCA,预处理时顺便把最小权值求出来
Code:
- #include<bits/stdc++.h>
- #define IO4 10000+10
- #define debug cout<<"Error"<<endl
- using namespace std;
- int n,m,q,cnt,cntt;
- //原图
- struct Edge {
- int from,to,wei;
- }e[*IO4];
- inline void ade(int u,int v,int w){
- e[++cnt].from=u;
- e[cnt].to=v;
- e[cnt].wei=w;
- }
- inline bool cmp(Edge a,Edge b){
- return a.wei>b.wei;
- }
- //最大生成树
- struct Edget {
- int nextt,tot,weit;
- }te[*IO4];
- int head[IO4];
- inline void adte(int u,int v,int w){
- te[++cntt].tot=v;
- te[cntt].weit=w;
- te[cntt].nextt=head[u];
- head[u]=cntt;
- }
- //并查集
- int fa[IO4];
- int fd(int x){
- return fa[x]==x?x:fa[x]=fd(fa[x]);
- }
- //Kruskal算法
- inline void Solve_MST(){
- int now=;
- sort(e+,e++cnt,cmp);
- for(int i=;i<=n;i++)fa[i]=i;
- for(int i=;i<=cnt;i++){
- int u=fd(e[i].from);
- int v=fd(e[i].to);
- if(u==v)continue;
- fa[u]=v;
- //建新图
- adte(u,v,e[i].wei);
- adte(v,u,e[i].wei);
- now++;
- if(now==n-)return;
- }
- }
- //搜索
- int f[IO4][],minw[IO4][],vis[IO4],dep[IO4];
- void DFS(int x){
- vis[x]=;
- for(int i=head[x];i;i=te[i].nextt){
- int tot=te[i].tot;
- if(vis[tot])continue;
- dep[tot]=dep[x]+;
- f[tot][]=x;
- //两个直接连接的点之间的最小权值就是这条边
- minw[tot][]=te[i].weit;
- DFS(tot);
- }
- }
- //预处理
- inline void Init(){
- for(int i=;i<=n;i++){
- if(!vis[i]){
- DFS(i);
- f[i][]=i;
- minw[i][]=0x3f3f3f3f;
- }
- }
- for(int l=;l<=;l++){
- for(int i=;i<=n;i++){
- f[i][l]=f[f[i][l-]][l-];
- //这里多了一步求最小权值
- //minw=min(前半minw,后半minw)
- minw[i][l]=min(minw[i][l-],minw[f[i][l-]][l-]);
- }
- }
- }
- //倍增求LCA(以下都是常规操作)
- inline int Solve_LCA(int x,int y){
- int ans=0x3f3f3f3f;
- if(fd(x)!=fd(y))return -;
- if(dep[x]<dep[y])swap(x,y);
- for(int l=;l>=;l--){
- if(dep[x]-(<<l)>=dep[y]){
- //注意要先取min否则x会改变
- ans=min(ans,minw[x][l]);
- x=f[x][l];
- }
- }
- if(x==y)return ans;
- for(int l=;l>=;l--){
- if(f[x][l]!=f[y][l]){
- //同上
- ans=min(ans,min(minw[x][l],minw[y][l]));
- x=f[x][l],y=f[y][l];
- }
- }
- //由于跳到LCA下面所以再取一步
- ans=min(ans,min(minw[x][],minw[y][]));
- return ans;
- }
- int main(){
- ios::sync_with_stdio();
- cin>>n>>m;
- for(int i=;i<=m;i++){
- int x,y,z;
- cin>>x>>y>>z;
- ade(x,y,z);
- }
- Solve_MST();
- Init();
- cin>>q;
- for(int i=;i<=q;i++){
- int x,y;
- cin>>x>>y;
- cout<<Solve_LCA(x,y)<<endl;
- }
- return ;//完结撒花
- }
[洛谷P1967][题解]货车运输的更多相关文章
- 【题解】【洛谷 P1967】 货车运输
目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...
- 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)
洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...
- 【洛谷1967】货车运输(最大生成树+倍增LCA)
点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
[洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...
- 洛谷 P1967 货车运输
洛谷 P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在 ...
- 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增
倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...
- [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
[洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...
- 洛谷P1967 [NOIP2013提高组Day1T2]货车运输
P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...
- 【洛谷P1967】[NOIP2013]货车运输
货车运输 题目链接 显然,从一点走到另一点的路径中,最小值最大的路径一定在它的最大生成树上 所以要先求出最大生成树,再在生成树上找最近公共祖先,同时求出最小值. #include<iostrea ...
随机推荐
- Airtest介绍与脚本入门
前言 通过阅读本小节教程,你将了解以下内容: 一个Airtest脚本例子的详细解析 如何在Python脚本中调用Airtest接口 图片语句的参数介绍 Airtest介绍 Airtest是一款基于Py ...
- Scala函数式编程(四)函数式的数据结构 上
这次来说说函数式的数据结构是什么样子的,本章会先用一个list来举例子说明,最后给出一个Tree数据结构的练习,放在公众号里面,练习里面给出了基本的结构,但代码是空缺的需要补上,此外还有预留的test ...
- c# 窗体开发3 文件处理技术
以字节形式向磁盘写入数据通常称为字节流(比特流) 常常使用System.Io 常用的类 类 说明 File 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象. ...
- Docker 构建私有仓库
Docker Hub 目前Docker官方维护了一个公共仓库Docker Hub,其中已经包含了数量超过15000的镜像.大部分需求都可以通过在Docker Hub中直接下载镜像来实现. 可以在htt ...
- html元素是否包含另外一个元素,以及classList属性
如何判断一个元素A包含了元素B呢?如果不用contains方法的话,如何做呢? 腾讯面试的时候也出了这道题啊,当时没看dom的知识,所以一抹黑哦... 那就判断B是否为A的child喽,那也就是A是B ...
- VMware修改默认开机方式
.首先删除已经存在的符号链接 ---------------------------------------------------------------------------------- rm ...
- 如何把图片变得炫酷多彩,Python教你这样实现!
有趣的图片 如何能让图片变得好玩?首先需要让它动起来!可如果是多张图片,我们还可以将其拼接起来组成gif动图,可一张图怎么玩?记得之前写过一个小练习,把一张图片拆分成九宫格的分片图.那么,能否由此下手 ...
- luogu P2947 [USACO09MAR]向右看齐Look Up |单调队列
题目描述 Farmer John's N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again stan ...
- 手撕 JVM 垃圾收集日志
下图是本篇的写作大纲,将从以下四个方面介绍怎么样处理 JVM 日志. 有准备才能不慌 想要分析日志,首先你得有日志呀,对不对.凡是未雨绸蒙总是没错的.所谓有日志的意思,你要把 JVM 参数配置好,日志 ...
- 最新28道java基础面试题-上
28道java基础面试题 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪 ...