题目传送门

前言

本题样例有问题,如果想要样例可以去 vjudge 上。

本题提交后可能会出现 UKE ,建议前往 link 提交,而且本篇题解中所提供的代码也为 link 代码。

前置知识

Kruskal 重构树 | 最近公共祖先

简化题意

给定一个 \(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

SP16113 SUBTLEBA - Trucks Transportation 题解的更多相关文章

  1. Codeforces 1101F Trucks and Cities dp (看题解)

    Trucks and Cities 一个很显然的做法就是二分然后对于每个车贪心取check, 这肯定会TLE, 感觉会给人一种贪心去写的误导... 感觉有这个误导之后很难往dp那个方向靠.. dp[ ...

  2. POJ 1797 Heavy Transportation(最短路&Dijkstra变体)题解

    题意:给你所有道路的载重,找出从1走到n的所有路径中载重最大的,即路径最小值的最大值. 思路:和之前的POJ3268很像.我们用Dijkstra,在每次查找时,我们把最大的先拿出来,因为最大的不影响最 ...

  3. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  4. POJ 1797 Heavy Transportation (dijkstra 最小边最大)

    Heavy Transportation 题目链接: http://acm.hust.edu.cn/vjudge/contest/66569#problem/A Description Backgro ...

  5. hdu 4940 Destroy Transportation system(水过)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4940 Destroy Transportation system Time Limit: 2000/1 ...

  6. New Year Transportation(水)

    New Year Transportation Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  7. zoj3231 Apple Transportation(最大流)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Apple Transportation Time Limit: 1 Second ...

  8. HDU 4940 Destroy Transportation system(无源汇上下界网络流)

    Problem Description Tom is a commander, his task is destroying his enemy’s transportation system. Le ...

  9. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E. Goods transportation 动态规划

    E. Goods transportation 题目连接: http://codeforces.com/contest/724/problem/E Description There are n ci ...

  10. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem C. Cargo Transportation 暴力

    Problem C. Cargo Transportation 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed ...

随机推荐

  1. python进阶(4)--字典

    文档目录: 一.一个简单的字典二.字典-增删改三.遍历字典四.字典嵌套 ---------------------------------------分割线:正文------------------- ...

  2. 【PID】初学者的pid,详细的介绍了代码为什么是这样写的

    from:Improving the Beginner's PID – Introduction « Project Blog (brettbeauregard.com)

  3. [转帖]Linux进程的Uninterruptible sleep(D)状态

    https://cloud.tencent.com/developer/article/1581022 Linux系统进程状态 PROCESS STATE CODES Here are the dif ...

  4. [转帖]Jmeter接口测试:参数化

    Jmeter接口请求中的参数经常需要通过参数进行赋值 引用形式:${} 变量时:${变量名} 函数时,${_函数名(参数1,参数2,参数3)} 值中"${n}"中,n为变量名:&q ...

  5. Systemd设置ulimit的方式与方法

    Systemd设置ulimit的方式与方法 摘要 Linux安装完成之后前面几件事情一般是处理selinux 以及处理ulimit 其实处理文件打开数有多种方法,之前也总结过, 但是最近因为syste ...

  6. 隐私集合求交(PSI)协议研究综述

    摘要 隐私集合求交(PSI)是安全多方计算(MPC)中的一种密码学技术,它允许参与计算的双方,在不获取对方额外信息(除交集外的其它信息)的基础上,计算出双方数据的交集.隐私集合求交在数据共享,广告转化 ...

  7. 拜占庭将军问题和 Raft 共识算法讲解

    作者: 京东物流 郭益如 导读 在分布式系统中, 什么是拜占庭将军问题?产生的场景和解决方案是什么?什么是 Raft 共识算法?Raft 算法是如何解决拜占庭将军问题的?其核心原理和算法逻辑是什么?除 ...

  8. 【发现一个问题】extjs-gpl-7.0: 当修改 store 对象的字段后,再次 loadPage() 后字段映射错误。

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 因为查询中需要每次返回数目不确定的 fields ,这就需 ...

  9. 深入学习C#系列文章01---C#3 革新写代码的新方式

    C#3 几乎所有的新特性都是为LINQ服务的,但他们单独使用也非常有用,接下来我们来简单看看C#3 的几个新特性吧. 一.自动实现的属性-----编写由字段直接支持的简单属性,不再显得臃肿不堪. 之前 ...

  10. 使用boot.iso镜像安装Oracle Linux 8

    本文记录使用boot.iso镜像安装Oracle Linux 8. 镜像下载 Oracle Linux 8 boot镜像可以从这里下载. 安装 Oracle Linux 8 boot镜像安装系统跟使用 ...