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 & ...
随机推荐
- HUD 5773 LIS(最长上升序列)
***关于lower_bound()的用法参见:http://blog.csdn.net/niushuai666/article/details/6734403 lower_bound用法:函数low ...
- 洛谷 P9916 「RiOI-03」Just a Q. (Easy ver.) 题解
前言 Div.2 Rank \(13\) 获奖了,题目也好评. 解法 题目链接:\(\color{Purple}\texttt{P9916「RiOI-03」Just a Q. (Easy ver.)} ...
- 【TouxhGFX】集成 之 《Using C code with TouchGFX》
在TouchGFX中使用C代码 您可能已经知道,TouchGFX是用C ++实现的,而TouchGFX API也是C ++.这意味着至少直接与UI相关的代码必须是C ++代码.但是,并不需要整个系统都 ...
- 02-MySQL基本操作
SQL 的一些简单语法规则 结束符 SQL 指令需要语句结束符,默认是英文分号;. 当然,还有另外两个结束符: \g 与英文分号;等效. \G:将查到的结构旋转90度变成纵向. 反引号`` SQL语句 ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.26)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- [转帖]TiDB 中的各种超时
https://docs.pingcap.com/zh/tidb/stable/dev-guide-timeouts-in-tidb 本章将介绍 TiDB 中的各种超时,为排查错误提供依据. GC 超 ...
- 【转帖】nginx变量使用方法详解-2
https://www.diewufeiyang.com/post/576.html 关于 Nginx 变量的另一个常见误区是认为变量容器的生命期,是与 location 配置块绑定的.其实不然.我们 ...
- [转帖]龙芯 vs 飞腾:各种测试数据看国产CPU水平
https://zhuanlan.zhihu.com/p/99921594 2019年年末,龙芯.飞腾两大国产CPU巨头更是相继组织了规模宏大的年会,发布了新型桌面芯片及其整机产品,顿时硝烟四起.各大 ...
- [转帖]HTTP与HTTPS超文本传输协议的区别是什么
https://www.likecs.com/show-308649882.html 随着越来越多的网站使用HTTPS加密,现在HTTPS的使用已经成了硬性要求了.虽然说https是http的安全版, ...
- [转帖] GC耗时高,原因竟是服务流量小?
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 最近,我们系统配置了GC耗时的监控,但配置上之后,系统会偶尔出现GC耗时大于1s的报警,排查花了一些力气,故 ...