[洛谷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 ...
随机推荐
- sql server 增删改(查太多了)
表: 学生(*学号,姓名,性别,年龄,专业) create table student( sno ) primary key, sname ) not null, ssex ), sage small ...
- Spring(Bean)2
<!-- util:list封装的心 --> <bean id="personList2" class="spring.beans.di.collect ...
- 【Android - 组件】之Activity的启动模式
Activity的启动模式目前有四种:standard.singleTop.singleTask 和 singleInstance. 1.standard standard 是标准模式,也是系统的默认 ...
- selenium处理iframe和动作链
selenium处理iframe和动作链 iframe iframe就是一个界面里嵌套了其他界面,这个时候selenium是不能从主界面找到子界面的属性,需要先找到子界面,再去找子界面的属性 动作链( ...
- fsockopen用feof读取http响应内容的一些问题
在前面三个例子中,都有这么一段代码: while (!feof($fp)) { // 读取文件/数据 //$content .= fgets($fp, 128); //$line = fread($f ...
- 链式栈-C语言实现
相对于顺序栈的空间有限,链式栈的操作则更加灵活 #include<stdio.h> #include<malloc.h> typedef int SElemType; //元素 ...
- c++关于multiset的头文件包含问题
最近在Bilibili上看到不少侯捷老师C++的视频教程,侯捷老师翻译了很多C++的经典书籍,比如<Essential C++中文版>.<STL源码剖析>,也写了<深入浅 ...
- Python基础之升级pip版本
使用python -m pip install --upgrade pip命令即可. 查看是否更新成功: 使用pip3 list命令即可.
- windows下利用iis建立网站网站并实现局域共享
博客园 首页 新随笔 联系 管理 订阅 随笔- 54 文章- 9 评论- 0 Windows下利用IIS建立网站并实现局域网共享 https://blog.csdn.net/qq_4148541 ...
- HDU 全国多校第四场 题解
题解 A AND Minimum Spanning Tree 参考代码: #include<bits/stdc++.h> #define maxl 200010 using namespa ...