• 题目链接:

    https://loj.ac/problem/136

  • 思路:

    在我的这篇博客中已经讲到什么是最短瓶颈路,同时给出了一个用Kruskal求最短瓶颈路的一个简洁易懂的方法,然而这道题目可以看作求所有点对的最短瓶颈路,显然那篇博客题解的方法不太管用,于是改进后有了这个算法:

    我们还是先用Kruskal求出最小生成树,同时记录最小生成树中个点与哪些点相连.然后我们把这个最小生成树转化为有根树来进行DFS处理。若正在处理的点编号为\(u\),它的一个后继点(即将DFS)编号\(v\),已经DFS过的一个点编号\(x\),\(ans[i][j]\)表示\(i\)到\(j\)的最短瓶颈路的大小。根据定义,显然:

    \(ans[x][v]=ans[v][x]=max(ans[u][v],ans[x][u],w(u,v))\)

    可以看到正在DFS的节点相当于一个转承的作用

    时间复杂度\(O(m\log m+n+k)\)

  • 代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <cmath>
#include <vector>
#include <map>
#include <queue>
#define ll long long
#define ri register int
using namespace std;
const int maxn=1005;
const int maxm=100005;
const int inf=0x7fffffff;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;
return ;
}
struct Edge{
int u,v,w;
Edge(int x,int y,int z){u=x,v=y,w=z;}
Edge(){u=v=0,w=inf;}
bool operator <(const Edge &b)const{
return w<b.w;
}
}edge[maxm];
int n,m,k;
vector <Edge>g[maxn];
int fa[maxn];
int get(int x){
if(fa[x]!=x)fa[x]=get(fa[x]);
return fa[x];
}
void Kruskal(){
int cnt=0,u,v,w;
for(ri i=1;i<=n;i++)fa[i]=i;
for(ri i=1;i<=m;i++){
u=edge[i].u,v=edge[i].v,w=edge[i].w;
u=get(u),v=get(v);
if(u!=v){
fa[u]=v;
g[u].push_back(Edge(u,v,w));
g[v].push_back(Edge(v,u,w));
cnt++;
if(cnt==n-1)break;
}
}
return ;
}
bool vis[maxn];
int ans[maxn][maxn];
void dfs(int now){
int u,v,w;
vis[now]=1;
for(ri i=0;i<g[now].size();i++){
v=g[now][i].v,w=g[now][i].w;
if(!vis[v]){
for(ri j=1;j<=n;j++){
if(vis[j])//如果它在有根树中已被访问过
{
ans[j][v]=ans[v][j]=max(ans[now][v],max(ans[now][j],w));
}
}
dfs(v);
}
}
return ;
}
int main(){
int u,v,w;
read(n),read(m),read(k);
for(ri i=1;i<=m;i++){
read(u),read(v),read(w);
edge[i].u=u,edge[i].v=v,edge[i].w=w;
}
sort(edge+1,edge+1+m);
Kruskal();
memset(ans,0,sizeof(ans));
memset(vis,0,sizeof(vis));
dfs(1);
while(k--){
read(u),read(v);
if(!ans[u][v])puts("-1");
else printf("%d\n",ans[u][v]);
}
return 0;
}
  • 注:

    1. 这个算法来自这里,但是他的代码中有一个错误就是上文提到\(ans[i][j]\)的转移

    2. 有兴趣的可以看一下增强版:https://loj.ac/problem/137

LOJ题解#136. 最小瓶颈路 DFS+Kruskal的更多相关文章

  1. LOJ#137. 最小瓶颈路 加强版(Kruskal重构树 rmq求LCA)

    题意 三倍经验哇咔咔 #137. 最小瓶颈路 加强版 #6021. 「from CommonAnts」寻找 LCR #136. 最小瓶颈路 Sol 首先可以证明,两点之间边权最大值最小的路径一定是在最 ...

  2. HDU4081:Qin Shi Huang's National Road System (任意两点间的最小瓶颈路)

    Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  3. UVA 11354 Bond(最小瓶颈路+倍增)

    题意:问图上任意两点(u,v)之间的路径上,所经过的最大边权最小为多少? 求最小瓶颈路,既是求最小生成树.因为要处理多组询问,所以需要用倍增加速. 先处理出最小生成树,prim的时间复杂度为O(n*n ...

  4. 【UVA534】Frogger 最小瓶颈路

    题目大意:给定一张 N 个点的完全图,求 1,2 号节点之间的一条最小瓶颈路. 题解:可知,最小瓶颈路一定存在于最小生成树(最小瓶颈树)中.因此,直接跑克鲁斯卡尔算法,当 1,2 号节点在同一个联通块 ...

  5. Codeforces 632F - Magic Matrix(暴力 bitset or Prim 求最小生成树+最小瓶颈路)

    题面传送门 开始挖老祖宗(ycx)留下来的东西.jpg 本来想水一道紫题作为 AC 的第 500 道紫题的,结果发现点开了道神题. 首先先讲一个我想出来的暴力做法.条件一和条件二直接扫一遍判断掉.先将 ...

  6. 最小瓶颈路 Uva 534 Frogger

    说明:关于Uva的题目,可以在vjudge上做的,不用到Uva(那个极其慢的)网站去做. 最小瓶颈路:找u到v的一条路径满足最大边权值尽量小 先求最小生成树,然后u到v的路径在树上是唯一的,答案就是这 ...

  7. UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)

    题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...

  8. UVa 11354 邦德(最小瓶颈路+LCA)

    https://vjudge.net/problem/UVA-11354 题意: 有n个城市m条道路,每条道路有一个危险系数.先在有若干个询问,要求找到一条从s到t的路,使得途径所有边的最大危险系数最 ...

  9. 【UVA10816】Travel in Desert (最小瓶颈路+最短路)

    UVA10816 Travel in Desert 题目大意 沙漠中有一些道路,每个道路有一个温度和距离,要求s,t两点间的一条路径,满足温度最大值最小,并且长度最短 输入格式 输入包含多组数据. 每 ...

随机推荐

  1. 编译openwrt时报错build_dir/hostpkg/libubox-2018-07-25-c83a84af/blobmsg_json.c:21:19: fatal error: json.h: No such file or directory

    答: 一. 详细日志: build_dir/hostpkg/libubox-2018-07-25-c83a84af/blobmsg_json.c:21:19: fatal error: json.h: ...

  2. Extjs4 修改combox中store的数据

    { xtype: "combo", fieldLabel: '选择模板', name: "TemplateType", fieldName: "Tem ...

  3. 阶段3 3.SpringMVC·_07.SSM整合案例_09.ssm整合之Spring整合MyBatis框架配置事务

    spring加入声明式的事物 配置事物 配置事物管理器 需要一个dataSource,引入上面的dataSource 配置事务通知 引入上面的transactionManager事物管理器 find开 ...

  4. 浅谈JS中 reduce() 的用法

    过去有很长一段时间,我一直很难理解 reduce() 这个方法的具体用法,平时也很少用到它.事实上,如果你能真正了解它的话,其实在很多地方我们都可以用得上,那么今天我们就来简单聊聊JS中 reduce ...

  5. vuex 使用

    一.什么是Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规则保证状态以一种可预测的方式发生变化 二. 为什么要使用Vuex ...

  6. 2019.11.07【每天学点SAP小知识】Day2 - ABAP 7.40新语法 - 内表

    今天学习一下内表的表达式在ABAP 7.4之后的语法: SELECT * FROM mara INTO TABLE @DATA(gt_mara)UP TO 10 ROWS. DATA gt_mara_ ...

  7. PHP 生成器 yield理解

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  8. 【HANA系列】SAP HANA LEFT/RIGHT字符串截取

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA LEFT/RI ...

  9. Django模板系统-标签Tags

    for <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul ...

  10. jQuery事件操作

    bind绑定事件 bind(type,data,fn) [参数描述] type (String) : 事件类型 data (Object) : (可选) 作为event.data属性值传递给事件对象的 ...