题目

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

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

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

然后考虑求最小权值

可以采用倍增求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. Xtrabackup 全备和还原以及增量备份和还原

    目录 MySQL环境介绍 全备和还原 准备备份目录 创建测试数据 全量备份 模拟删除数据 还原数据操作 第一步 备份备份文件 第二步 关闭数据库 第三步 移除数据库的data目录 第四步 恢复前准备 ...

  2. MySQL详解

    MySQL详解 什么是数据库 # 用来存储数据的仓库 # 数据库可以在硬盘及内存中存储数据 # 数据库与文件存储数据区别 # 数据库本质也是通过文件来存储数据, 数据库的概念就是系统的管理存储数据的文 ...

  3. MySQL主从扩展知识

    6月29/7月2日任务 说明:这两天无新课,主要是扩充知识面注意:这两天的任务,需要回专贴.需要你们通过看这些东西总结成自己的心得. 不能照搬,必须要自己理解,能看多少就看多少,看不完也没有关系,但一 ...

  4. Nginx+MySQL+PHP+Redis多机部署(测试发布discuz论坛)

    链接:LNMP+Redis单机部署 1.实战多机部署环境 nginx服务器: 192.168.1.3 php服务器:    192.168.1.4 mysql服务器: 192.168.1.10 red ...

  5. python_网络编程

    网络ISO(国际标准化组织)--->网络体系结构标准(OSI模型)OSI: 网络信息传输比较复杂需要很多功能协同-->将功能分开,降低耦合度,让每个模块完成一定的功能-->将这些模块 ...

  6. KETTLE多表关联的同步一张表的两种实现方式

    以下操作都在5.0.1版本下进行开发,其余版本可以进行自动比对 在平时工作当中,会遇到这种情况,而且很常见.比如:读取对方的多个视图或者表,写入目标库的一张表中,就涉及到多表的同步. 多表同步可以有以 ...

  7. HDU3032 Nim or not Nim?(Lasker’s Nim游戏)

    Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. CodeChef FAVNUM FavouriteNumbers(AC自动机+数位dp+二分答案)

    All submissions for this problem are available. Chef likes numbers and number theory, we all know th ...

  9. BZOJ1014 火星人的prefix

    火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 8 9 10 11 字 ...

  10. Swap Digits

    Description ) in the first line, which has the same meaning as above. And the number is in the next ...