题意:奶牛们为了比赛要刻苦训练跳木桩。现在有n个木桩,并知道其中m对木桩的高度差。问奶牛们能从木桩u跳到木桩v,最少的跳跃高度是多少?
思路:基础的floyd。只是在传递的地方要改变一下松弛条件就可以了。
源代码:(540K 422MS/329MS)
#include<iostream>
using namespace std;
const int Max = 305;
const int inf = 99999999;
int max(int a, int b){
return a > b ? a : b;
}
int main(){
int n, m, t, u, v, w, i, j, k;
int map[Max][Max];
scanf("%d%d%d", &n, &m, &t);
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++){
if(i == j) map[i][j] = 0;
else map[i][j] = inf;
}
while(m --){
scanf("%d%d%d", &u, &v, &w);
if(map[u][v] > w)
map[u][v] = w;
}
for(k = 1; k <= n; k ++)
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++){
int w = max(map[i][k], map[k][j]); // 不用max函数的话就从422MS优化为329MS。
if(map[i][j] > w)
map[i][j] = w;
}
while(t --){
scanf("%d%d", &u, &v);
if(map[u][v] == inf) printf("-1/n");
else printf("%d/n", map[u][v]);
}
return 0;
}