题目

这道题让我们求最小限重的最大值

显然可以先求出最大生成树,然后在树上进行操作

因为如果两点之间有多条路径的话一定会走最大的,而其他小的路径是不会被走的

然后考虑求最小权值

可以采用倍增求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][题解]货车运输的更多相关文章

  1. 【题解】【洛谷 P1967】 货车运输

    目录 洛谷 P1967 货车运输 原题 题解 思路 代码 洛谷 P1967 货车运输 原题 题面请查看洛谷 P1967 货车运输. 题解 思路 根据题面,假设我们有一个普通的图: 作图工具:Graph ...

  2. 【题解】洛谷P1967 [NOIP2013TG] 货车运输(LCA+kruscal重构树)

    洛谷P1967:https://www.luogu.org/problemnew/show/P1967 思路 感觉2013年D1T3并不是非常难 但是蒟蒻还是WA了一次 从题目描述中看出每个点之间有许 ...

  3. 【洛谷1967】货车运输(最大生成树+倍增LCA)

    点此看题面 大致题意: 有\(n\)个城市和\(m\)条道路,每条道路有一个限重.多组询问,每次询问从\(x\)到\(y\)的最大载重为多少. 一个贪心的想法 首先,让我们来贪心一波. 由于要求最大载 ...

  4. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  5. 洛谷 P1967 货车运输

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

  6. 洛谷P3379lca,HDU2586,洛谷P1967货车运输,倍增lca,树上倍增

    倍增lca板子洛谷P3379 #include<cstdio> struct E { int to,next; }e[]; ],anc[][],log2n,deep[],n,m,s,ne; ...

  7. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  8. 洛谷P1967 [NOIP2013提高组Day1T2]货车运输

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

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

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

随机推荐

  1. 关于for循环中使用setTimeout

    我们先来简单了解一下setTimeout延时器的运行机制.setTimeout会先将回调函数放到等待队列中,等待区域内其他主程序执行完毕后,按时间顺序先进先出执行回调函数.本质上是作用域的问题. 因此 ...

  2. JavaScript---1.计算机的编程基础

    学习内容:编程语言.计算机基础 1编程语言 程序员通过编程语言来控制计算机 编程语言:机器语言(计算机只认识机器语言).汇编语言(直接对硬件操作,指令采用英文缩写的标识符,容易记忆).高级语言(C\C ...

  3. python排序算法之一:冒泡排序(及其优化)

    相信冒泡排序已经被大家所熟知,今天看了一篇文章,大致是说在面试时end在了冒泡排序上,主要原因是不能给出冒泡排序的优化. 所以,今天就写一下python的冒泡排序算法,以及给出一个相应的优化.OK,前 ...

  4. VUE+DRF系列

    vue基础系列 001 路飞学诚项目简介 002 Vue简介 003 Vue引入 004 文本指令 005 事件指令 006 斗篷指令 007 属性指令 008 表单指令 009 条件指令 010 路 ...

  5. js对象的浅拷贝与深拷贝

    浅拷贝和深拷贝都是对于JS中的引用类型而言的,浅拷贝就只是复制对象的引用(堆和栈的关系,原始(基本)类型Undefined,Null,Boolean,Number和String是存入堆,直接引用,ob ...

  6. 使用Python进行防病毒免杀

    很多渗透工具都提供了权限维持的能力,如Metasploit.Empire和Cobalt Strike,但是都会被防病毒软件检测到这种恶意行为.在探讨一个权限维持技巧的时候,似乎越来越多的人关注的是,这 ...

  7. Xcode11 踩坑记录

    1.UITextView控件莫名导致崩溃 如上图所示,点击Step over 前进进入编译器内部 在lldb控制台输入指令 po $arg1 看到编译器给的提示是由于UITextView的问题. 解决 ...

  8. 适用于带fifo接口的存储器和显示器测试模块封装 挑战cb

    cb说完美是没有极限的,对此我表示赞同,自从用了cb的板子,玩开cmos,fpga,sdram,vga等. 不断涌现的是,双端口sdram,四端口sdram,各式各样的封装,但是大同小异,但总是有些不 ...

  9. [vue]初探vue生态核心插件Vuex

    为什么会有 Vuex 这个东西 ? 一个应用内部运行的机制,事件 -> 状态 -> UI,我们的前端常常会因为这两个过程而产生大量代码,从而变得难以维护. vue的声明式渲染,解决了从 状 ...

  10. 【React】377- 实现 React 中的状态自动保存

    点击上方"前端自习课"关注,学习起来~ 作者:陈俊宇 https://github.com/CJY0208 什么是状态保存? 假设有下述场景: 移动端中,用户访问了一个列表页,上拉 ...