题目

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

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

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

然后考虑求最小权值

可以采用倍增求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. Winows下安装RabbitMQ

    RabbitMQ的简介 RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源 ...

  2. 04-kubernetes 资源清单定义入门

    目录 资源对象 创建资源的方法 清单帮助命令 创建测试清单 资源的三种创建方式 资源对象 workload:Pod, ReplicaSet, Deployment, StatefulSet, Daem ...

  3. python中68个内置函数的总结

    内置函数 内置函数就是python给你提供的, 拿来直接用的函数, 比如print., input等. 截止到python版本3.6.2 python一共提供了68个内置函数. #68个内置函数 # ...

  4. 自古逢秋悲寂寥,奈何今秋热成雕?Python使用Pyecharts统计全国温度Top10并绘图

    秋词-刘禹锡 自古逢秋悲寂寥, 我言秋日胜春朝. 晴空一鹤排云上, 便引诗情到碧霄. 古人谈及秋天,都是悲凉寂寥,那么-.我好想回到古代的秋天啊!明明到了秋天,为什么最近的气温比夏天还热. 之前做天气 ...

  5. 机器学习-Python 01

    机器学习中最常用最流行的语言工具现阶段应该是Python, 这篇文章主要介绍一些常用的Python语法知识.本篇博文适合那些有其他语言基础的程序员们,如果一点基础都没有,我建议先跳过.博主以前是做移动 ...

  6. [TimLinux] myblog 数据表格显示

    1. 设计 2. 数据 创建数据库用户: CREATE USER IF NOT EXISTS 'user1'@'MyBlogPwd123'; GRANT ALL ON d1.* TO 'user1'@ ...

  7. POJ1458 Subsquence

    A subsequence of a given sequence is the given sequence with some elements (possible none) left out. ...

  8. A*算法在最短路问题的应用及其使用举例

    1 A*算法 A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的: 其中f(n)是节点n的估价函数,g(n)表示实际状态空间中从初始节点到n节点的实际代价,h(n)是从n到 ...

  9. A.Changing Volume

    题目:改变音量 题意:给定两个数a和b,有6个操作(-5, -2, -1, +1, +2, +5),求a变到b的最小操作次数 操作的过程中不能变到小于0,即音量不能调到小于0 分析: (贪心),我们可 ...

  10. Web基础了解版03-jQuery

    jQuery jQuery,顾名思义,也就是JavaScript和查询(Query)极大地简化了JavaScript开发人员遍历HTML文档.操作DOM.处理事件.执行动画和开发Ajax. jQuer ...