题目描述

给定一个包含 n nn 个节点和 m mm 条边的图,每条边有一个权值。
你的任务是回答 k kk 个询问,每个询问包含两个正整数 s ss 和 t tt 表示起点和终点,要求寻找从 s ss 到 t tt 的一条路径,使得路径上权值最大的一条边权值最小。

输入格式

第一行包含三个整数 n nn、m mm、k kk,分别表示 n nn 个节点, m mm 条路径, k kk 个询问。

接下来 m mm 行,每行三个整数 u uu , v vv , w ww, 表示一个由 u uu 到 v vv 的长度为 w ww 的双向边。

再接下来 k kk 行,每行两个整数 s ss , t tt,表示询问从 s ss 连接到 t tt 的所有路径中单边长度最大值的最小值。

输出格式

输出包含 k kk 行,每一行包含一个整数 p pp 。p pp 表示 s ss 连接到 t tt 的所有路径中单边长度最大值的最小值。另外,如果 s ss 到 t tt 没有路径相连通,输出 -1 即可。

样例

样例输入

8 11 3
1 2 10
2 5 50
3 4 60
7 5 60
3 6 30
1 5 30
6 7 20
1 7 70
2 3 20
3 5 40
2 6 90
1 7
2 8
6 2

样例输出

30
-1
30

数据范围与提示

对于 30% 30\%30% 的数据 n≤100,m≤1000,k≤100,w≤1000 n \leq 100, m \leq 1000, k \leq 100, w \leq 1000n≤100,m≤1000,k≤100,w≤1000 
对于 70% 70\%70% 的数据 n≤1000,m≤10000,k≤1000,w≤100000 n \leq 1000, m \leq 10000, k \leq 1000, w \leq 100000n≤1000,m≤10000,k≤1000,w≤100000 
对于 100% 100\%100% 的数据 n≤1000,m≤100000,k≤1000,w≤10000000 n \leq 1000, m \leq 100000, k \leq 1000, w \leq 10000000n≤1000,m≤100000,k≤1000,w≤10000000 
本题可能会有重边。
为了避免 Special Judge,本题所有的 w ww 均不相同。

题解:

同样是基于最小生成树,我们将其中关键信息保存

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1000+10;
const int INF=0x3f3f3f3f;
int n,m,k;
int mapp[MAXN][MAXN];
int ans[MAXN][MAXN],dis[MAXN],pri[MAXN];
bool vis[MAXN];
void prim()
{
memset(vis, false, sizeof(vis));
for (int i = 1; i <=n ; ++i)
{
dis[i]=INF;
pri[i]=i;
}
dis[1]=0;
for (int i = 1; i <=n ; ++i) {
int MAXX=INF,v=-1;
for (int j = 1; j <=n ; ++j) {
if(!vis[j]&&dis[j]<MAXX)
{
MAXX=dis[v=j];
}
}
if(v==-1)
break;
for (int j = 1; j <=n ; ++j) {
if(vis[j])
{
ans[v][j]=ans[j][v]=max(ans[pri[v]][j],MAXX);
}
}
vis[v]=true;
for (int j = 1; j <=n ; ++j) {
if(!vis[j]&&mapp[v][j]<dis[j])
{
dis[j]=mapp[v][j];
pri[j]=v;
}
}
}
} int main()
{
scanf("%d%d%d",&n,&m,&k);
int x,y,z;
memset(mapp,0x3f, sizeof(mapp));
memset(ans,0, sizeof(ans));
for (int i = 0; i <=n ; ++i) {
mapp[i][i]=0;
}
for (int i = 0; i <m ; ++i) {
scanf("%d%d%d",&x,&y,&z);
if(mapp[x][y]>z)
mapp[x][y]=mapp[y][x]=z;
}
prim();
while(k--)
{
scanf("%d%d",&x,&y); printf("%d\n",ans[x][y]==0?-1:ans[x][y]);
}
return 0;
} //int prim(int s)
//{
// int res=0;
// memset(ans,0,sizeof(ans));// 初始化目标数组
// for(int i=1;i<=n;i++)
// vis[i] = false, d[i] = INF, pri[i]=i;//初始化 标记、距离、父亲数组。
//
// d[s]=0; // 自身的距离为零
// for(int i=0;i<n;i++) // prim考察剩下的n - 1个点
// {
// int maxx=INF, v=-1; // 比较和点的位置
// for(int j=1;j<=n;j++) // 寻找与最小生成树集合最近的点
// {
// if(!vis[j]&&d[j]<maxx)
// {
// maxx=d[v=j]; // 写法不错
// }
// }
// if(v==-1) // 未找到的判断
// break;
//
// for(int j=1;j<=n;j++) //
// if(vis[j])
// ans[v][j] = ans[j][v] = max(ans[pri[v]][j], maxx);
//
// res+=maxx; // 最小生成树权值更新
// vis[v]=true; // 将找到的点加入集合
//
// for(int j=1;j<=n;j++)
// {
// if(!vis[j]&&mapp[v][j]<d[j])
// {
// d[j] = mapp[v][j]; // 更新距离
// pri[j] = v; // 更新父亲节点。
// }
// }
// }
// return res;
//}

  

loj136 (最小瓶颈路,多次询问)的更多相关文章

  1. 最小瓶颈路 Uva 534 Frogger

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

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

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

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

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

  4. BZOJ 3732 Network 最小瓶颈路

    题目大意:给出一个无向边,非常多询问,问x,y两地之间的最长路最短是多少. 思路:乍一看好像是二分啊. 的确这个题二分能够做.可是时间会慢非常多,有的题直接就T掉(NOIP2013货车运输). 事实上 ...

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

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

  6. 【UVA534】Frogger 最小瓶颈路

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

  7. 【20181102T2】飞越行星带【智商题+最小瓶颈路】

    题面 [正解] 一眼不可做啊 --相当于求路线上穿过的点最小距离最大 最小最大--二分啊 现在相当于给一个直径,要判断这个直径是否能从左边穿到右边 我们可以在距离不超过直径的点连一条边,\(y=0\) ...

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

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

  9. 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 ...

随机推荐

  1. ubuntu怎么关防火墙

    1.关闭ubuntu的防火墙 ufw disable2.卸载了iptables apt-get remove iptables 1.用iptables -F这个命令来关闭防火墙,但是使用这个命令前,千 ...

  2. no.1 github

    正是Github,让社会化编程成为现实. github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.它是由Chris Wanstrath ...

  3. 搭建packagist私服和composer

    1.下载源码 https://github.com/composer/packagist 2.修改配置文件 cp app/config/parameters.yml.dist  app/config/ ...

  4. IOS CoreData的(增删查改)

    (1).CoreDataa>什么是CoreDatab>CoreData增删改查 "什么时候使用COredata 什么时候使用FMDatabases"CoreData 在 ...

  5. Alex 的 Hadoop 菜鸟教程: 第3课 Hadoop 安装教程 - 非HA方式 (一台server)

    原帖地址: http://blog.csdn.net/nsrainbow/article/details/36629741 接上一个教程:http://blog.csdn.net/nsrainbow/ ...

  6. 高通Vuforia

    这里使用高通的Vuroria来做一个AR歌姬. 工具: Vuforia,MMD4Mecanim 模型: 初音未来pmd模型文件,极乐净土vmd动作文件. 逻辑: 当发现识别卡时:开启音乐,模型速度为1 ...

  7. c#隐藏tabcontrol选项卡

    隐藏:Tab1.TabPage2.Parent = null;显示:Tab1.TabPage2.Parent =Tab1;tab1为tab控件名,TabPage2为选项卡名.

  8. Mac下更新Vim到最新版本

    目前,Mac内置的Vim是7.3版本的,而且还缺少很多功能,下面介绍如何通过源码安装更新最新版本的Vim,同时保留系统内置的Vim. # 下载Vim源代码 git clone https://gith ...

  9. JavaEE权限管理系统的搭建(五)--------RBAC权限管理中的权限菜单的显示

    上一小节实现了登录的实现,本小节实现登录后根据用户名查询当前用户的角色所关联的所有权限,然后进行菜单的显示.登录成功后,如下图所示,管理设置是一级菜单,管理员列表,角色管理,权限管理是二级菜单. 先来 ...

  10. C#基础 一(方法详解)

    需要知道:类和方法的关系 方法和参数修饰符 自定义方法可以有或没有参数,也可以有或没有返回值.可以被各种关键字(static.virtual.public.new等)修饰以限制其行为. C#参数修饰符 ...