[洛谷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 ...
随机推荐
- Winows下安装RabbitMQ
RabbitMQ的简介 RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源 ...
- 04-kubernetes 资源清单定义入门
目录 资源对象 创建资源的方法 清单帮助命令 创建测试清单 资源的三种创建方式 资源对象 workload:Pod, ReplicaSet, Deployment, StatefulSet, Daem ...
- python中68个内置函数的总结
内置函数 内置函数就是python给你提供的, 拿来直接用的函数, 比如print., input等. 截止到python版本3.6.2 python一共提供了68个内置函数. #68个内置函数 # ...
- 自古逢秋悲寂寥,奈何今秋热成雕?Python使用Pyecharts统计全国温度Top10并绘图
秋词-刘禹锡 自古逢秋悲寂寥, 我言秋日胜春朝. 晴空一鹤排云上, 便引诗情到碧霄. 古人谈及秋天,都是悲凉寂寥,那么-.我好想回到古代的秋天啊!明明到了秋天,为什么最近的气温比夏天还热. 之前做天气 ...
- 机器学习-Python 01
机器学习中最常用最流行的语言工具现阶段应该是Python, 这篇文章主要介绍一些常用的Python语法知识.本篇博文适合那些有其他语言基础的程序员们,如果一点基础都没有,我建议先跳过.博主以前是做移动 ...
- [TimLinux] myblog 数据表格显示
1. 设计 2. 数据 创建数据库用户: CREATE USER IF NOT EXISTS 'user1'@'MyBlogPwd123'; GRANT ALL ON d1.* TO 'user1'@ ...
- POJ1458 Subsquence
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. ...
- A*算法在最短路问题的应用及其使用举例
1 A*算法 A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的: 其中f(n)是节点n的估价函数,g(n)表示实际状态空间中从初始节点到n节点的实际代价,h(n)是从n到 ...
- A.Changing Volume
题目:改变音量 题意:给定两个数a和b,有6个操作(-5, -2, -1, +1, +2, +5),求a变到b的最小操作次数 操作的过程中不能变到小于0,即音量不能调到小于0 分析: (贪心),我们可 ...
- Web基础了解版03-jQuery
jQuery jQuery,顾名思义,也就是JavaScript和查询(Query)极大地简化了JavaScript开发人员遍历HTML文档.操作DOM.处理事件.执行动画和开发Ajax. jQuer ...