问题描述
蒜头君的训练室有 N 个站点,另外有 M 条单向边连接这些站点。第 i 条路从 Si站到 Ei站,有高度为 Hi的围栏,蒜头君是需要跳跃的。
现在蒜头君们有 T 个任务要完成。第 ii 个任务,蒜头君要从 Ai站到 Bi站,蒜头君想要他们路径中最高围栏尽可能小。请你确定这个高度。
输入格式
第一行输入三个整数 N, M, T。(1≤N≤300,1≤M≤25000,1≤T≤40000)。
接下来 M 行,每行三个整数 Si,Ei,Hi(1≤Si,Ei≤N,1≤Hi≤10e6)
再接下来 T 行,每行两个整数 Ai,Bi。(1≤Ai,Bi≤N)
除了这 M 组关系,其他任意两人之间均不相识。
输出格式
对于每个询问,输出最小的最大高度。若无法到达,则输出−1。
样例输入
5 6 3
1 2 12
3 2 8
1 3 5
2 5 3
3 4 4
2 4 8
3 4
1 2
5 1
样例输出
4
8
-1
解题思路:不断更新两个点之间可到路径的最高障碍物的最小值
#include<bits/stdc++.h>
using namespace std;
const int MAX_N=310;
const int MAX_M=25010;
const int inf=0x3f3f3f3f;
int n,m,t;
int g[MAX_N][MAX_N];
void init(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
g[i][j]=0;
}else{
g[i][j]=inf;
}
}
}
}
void insert(int u,int v,int w){
g[u][v]=w;
}
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][k]!=inf&&g[k][j]!=inf){
int hh=max(g[i][k],g[k][j]);
if(hh<g[i][j]){
g[i][j]=hh;
}
}
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&t);
init();
int u,v,w;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
insert(u,v,w);
}
floyd();
int a,b;
for(int i=1;i<=t;i++){
scanf("%d%d",&a,&b);
if(g[a][b]!=inf){
printf("%d\n",g[a][b]);
}else{
cout<<"-1"<<endl;
}
}
return 0;
}