UVA12655 Trucks 题解
前言
中文题目可以看 link 。
前置知识
简化题意
给定一个 \(N\) 个点 \(M\) 条边的有向图,共有 \(S\) 次询问,每次询问从 \(L\) 到 \(H\) 所有的路径中最小的权值的最大值(多组数据)。
- 本题即最大瓶颈路问题。
解法
使最小的权值最大,不难想到利用 Kruskal 重构树算法求解。
- 最小的权值最大的这个权值一定出现在原图的最大生成树上。
令 \(rt\) 表示原图的最大生成树的树根,\(dis_{i,j}\) 表示从 \(i\) 到 \(j\) 的路径上的最小值,不难得出 \(dis_{i,j}=\min(dis_{i,lca_(i,j)},dis_{j,lca(i,j)})\)。求任意两点的 LCA 可以用倍增或树剖等做法,此题使用倍增做法。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
struct node
{
int nxt,from,to,w;
}e[700001],E[700001];
int head[700001],dep[700001],fminn[700001][25],fa[700001][25],f[700001],N,cnt=0;
bool cmp(node a,node b)
{
return a.w>b.w;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
e[cnt].w=w;
head[u]=cnt;
}
int find(int x)
{
if(f[x]==x)
{
return x;
}
else
{
return f[x]=find(f[x]);
}
}
void kruskal(int m)
{
int i,x,y;
sort(E+1,E+1+m,cmp);
for(i=1;i<=m;i++)
{
x=find(E[i].from);
y=find(E[i].to);
if(x!=y)
{
f[x]=y;
add(E[i].from,E[i].to,E[i].w);
add(E[i].to,E[i].from,E[i].w);
}
}
}
void dfs(int x,int father,int w)
{
fa[x][0]=father;
dep[x]=dep[father]+1;
fminn[x][0]=w;
for(int i=1;(1<<i)<=dep[x];i++)
{
fa[x][i]=fa[fa[x][i-1]][i-1];
fminn[x][i]=min(fminn[x][i-1],fminn[fa[x][i-1]][i-1]);
}
for(int i=head[x];i!=0;i=e[i].nxt)
{
if(e[i].to!=father)
{
dfs(e[i].to,x,e[i].w);
}
}
}
int lca(int x,int y)
{
if(find(x)!=find(y))
{
return -1;
}
else
{
int minn=0x7f7f7f7f;
if(dep[x]>dep[y])
{
swap(x,y);
}
for(int i=N;i>=0;i--)
{
if(dep[x]+(1<<i)<=dep[y])
{
minn=min(minn,fminn[y][i]);
y=fa[y][i];
}
}
if(x==y)
{
return minn;
}
else
{
for(int i=N;i>=0;i--)
{
if(fa[x][i]!=fa[y][i])
{
minn=min(minn,min(fminn[x][i],fminn[y][i]));
x=fa[x][i];
y=fa[y][i];
}
}
minn=min(minn,min(fminn[x][0],fminn[y][0]));
return minn;
}
}
}
int main()
{
int n,m,k,i,u,v,w,l,r;
while(cin>>n>>m>>k)
{
cnt=0;
memset(e,0,sizeof(e));
memset(E,0,sizeof(E));
memset(fa,0,sizeof(fa));
memset(dep,0,sizeof(dep));
memset(head,0,sizeof(head));
memset(fminn,0x3f,sizeof(fminn));
for(i=1;i<=n;i++)
{
f[i]=i;
}
for(i=1;i<=m;i++)
{
cin>>E[i].from>>E[i].to>>E[i].w;
}
kruskal(m);
N=log2(n)+1;
for(i=1;i<=n;i++)
{
if(dep[i]==0)
{
dfs(i,0,0x7f7f7f7f);
}
}
for(i=1;i<=k;i++)
{
cin>>l>>r;
cout<<lca(l,r)<<endl;
}
}
return 0;
}
后记
多倍经验:P1967 | P9235 | UVA12655 | P2245 | UVA11354 | AT_joisc2014_e
UVA12655 Trucks 题解的更多相关文章
- Codeforces 1101F Trucks and Cities dp (看题解)
Trucks and Cities 一个很显然的做法就是二分然后对于每个车贪心取check, 这肯定会TLE, 感觉会给人一种贪心去写的误导... 感觉有这个误导之后很难往dp那个方向靠.. dp[ ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 安卓系统如何使用谷歌框架下的app?
1.问题 安卓系统从理论上无法使用谷歌框架下的应用(比如像GMail,YouTube,Google play等等),会导致一些麻烦(闪退,卡在登陆界面等等) 注意:使用前提是会魔法,否则请绕道 2.解 ...
- 【中介者模式(Mediator)】使用Java实现中介者模式
引言 中介者,何为中介者,顾名思义就是我们的在处理A和B之间的关系的时候,引入一个中间人,来处理这两者之间的关系,例如生活中我们需要去租房,买房,都会有中介,来处理房东和租客之间的协调关系,这个就是中 ...
- [转帖]12.24.2 DECIMAL Data Type Characteristics
https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html This section discusses the characteri ...
- [转帖]Python基础之判断和循环(三)
https://www.jianshu.com/p/5a7552821c63 一.判断 关于判断,跟字面意思一样,就是判断某一个时刻应不应该做某件事: 语法: if 判断条件: 执行语句-- else ...
- STM32CubeMX教程25 PWR 电源管理 - 睡眠、停止和待机模式
1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...
- 【DS】【AtCoder】Pakencamp 2022 Day2 H
2023.6.30 Problem Link 有 \(n\) 个帮派在打架,每个帮派有一个大小 \(a_i\),每相邻两个帮派有一个仇恨度 \(b_i\).现在有 \(Q\) 次单点修改 \(a_i\ ...
- How to Use Github
C:\Windows\System32\drivers\etc\hosts 在最后加上一句 20.205.243.166 github.com 从 https://ping.chinaz.com/ 来 ...
- vue关于通过下标更改数组的理解
案例1:通过下标更改数组失败 <template> <div> <el-button @click="handlerMe2"> 改变 arr & ...
- 纯c#运行开源本地大模型Mixtral-8x7B
先看效果图,这是一个比较典型的逻辑推理问题,以下是本地运行的模型和openai gpt3.5的推理对比 本地运行Mixtral-8x7B大模型: chatgpt3.5的回答: 关于Mixtral 8x ...
- pymongo中针对指定集合更新validator规则
问题描述: 针对mongo中已创建的集合,更新validator验证器规则 解决方法 在确保pymongo中所使用的用户对目标数据库具有dbAdmin之类的管理权限的前提下(若无权限,可在mongo中 ...