有N个地点,它们之间存在M条单向路径,每条路径中间有一个栏。现在给定一些起点和终点,要求找出它们之间的一条路径,使路径经过的栏的高度的最大值最小。
简单的多源最短路径,把路径值变成经过的最大高度值,用FLOYD算法更新每对点之间的最大高度值,然后对于每个起点和终点输出它们之间的最大高度值,若无法从起点到达终点,则输出-1。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 305;
const int MAX = 0xfffffff;
int n, m, t;
int edge[N][N];
void floyd()
{
int tmax;
for (int k = 1; k <= n; ++k)
{
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
int tmax = edge[i][k] > edge[k][j] ? edge[i][k] : edge[k][j];
if (tmax < edge[i][j]) edge[i][j] = tmax;
}
}
}
}
int main()
{
int beg, end, dis;
scanf("%d%d%d", &n, &m, &t);
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
edge[i][j] = MAX;
}
}
for (int i = 0; i < m; ++i)
{
scanf("%d%d%d", &beg, &end, &dis);
edge[beg][end] = dis;
}
floyd();
for (int i = 0; i < t; ++i)
{
scanf("%d%d", &beg, &end);
if (edge[beg][end] == MAX) printf("-1\n");
else printf("%d\n", edge[beg][end]);
}
return 0;
}