题目描述
约翰想让她的奶牛准备晋级跳跃比赛,贝茜和她的伙伴们正在练习跨栏。她们很累,所以她们想消耗最少的能量来跨栏。
显然,对于一头奶牛跳过几个矮栏是很容易的,但是高栏却很难。于是,奶牛们总是关心路径上最高的栏的高度。
奶牛的训练场中有N个站台,分别标记为1到N。所有站台之间有M条单向路径,第i条路径是从站台Si开始到站台Ei,其中最高的栏的高度为Hi。无论如何跑,奶牛们都要跨栏。
奶牛们有T个训练任务要完成,第i个任务包含两个数字Ai和Bi,表示奶牛必须从站台Ai跑到站台Bi,可以路过别的站台。奶牛们想找一条路径从站台Ai到站台Bi,使路径上最高的栏的高度最小。
你的任务就是写一个程序,计算出路径上最高的栏的高度的最小值。
输入格式
第1行输入三个整数N,M,T;
接下来M行每行包含三个整数Si,Ei,Hi;
接下来T行每行包含两个整数,表示1个任务的起始站台和目标站台Ai,Bi;
输出格式
共T行,每行一个整数,表示1个任务中路径上最高栏的高度的最小值,如果无法到达,输出-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
输出说明
任务1:最简单的办法是直接从站台3到站台4。
任务2:和直接从站台1到站台2相比,更好的方法是站台1到站台3再到站台2。
任务3:没有路径从5开始,所以找不出路径。
数据规模
对于25%的数据:1≤N≤20;1≤M≤30;1≤T≤20;
对于50%的数据:1≤N≤100;1≤M≤2,000;1≤T≤2,000;
对于100%的数据:1≤N≤300;1≤M≤25,000;1≤T≤40,000;1≤Si,Ei,Ai,Bi≤N;1≤Hi≤10^6;
主要思路
这是一道Floyd模板题(多源)
动态转移方程: f [ i ] [ j ] = min ( f [ i ] [ j ] , max ( f [ i ] [ k ] , f [ k ] [ j ] ) )
——————————AC代码
#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int f[301][301];
int main() {
memset(f,0x3f,sizeof(f));
scanf("%d%d%d",&n,&m,&q);
for (int i = 1,a,b,c; i <= m; i++) {
scanf ("%d%d%d", &a, &b, &c);
f[a][b] = min (f[a][b], c);
}
for (int k = 1;k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
f[i][j] = min(f[i][j],max(f[i][k],f[k][j]));
for(int i=1,u,v;i<=q;i++){
cin>>u>>v;
if(f[u][v]==0x3f3f3f3f)printf("-1\n");
else printf("%d\n",f[u][v]);
}
return 0;
}
——————————QAQ