标签:
问题:
牛要跨过一些障碍,希望以最小的体力跨过障碍,并且对于一条路径,只在乎其中最高的障碍。
输入N代表站点数,标记为1—N,输入M代表路径数,从站点S到E之间需要跨过高度为H的障碍。
输入T代表牛要完成的任务数。对于每个任务,输入A,B,输出一条从站点A到B的路径,使需要跨过的最高障碍为最低。
题解:
变形的Floyd。
/******************************************* Problem: 3615 User: Memory: 960K Time: 688MS Language: G++ Result: Accepted ********************************************/ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int N = 305; int mp[N][N]; int dis[N], vis[N]; void floyd(int n) { int i, j, k; for (k = 1; k <= n; ++k) for (i = 1; i <= n; ++i) for (j = 1; j <= n; ++j) if (mp[i][j] > max(mp[i][k] , mp[k][j])) mp[i][j] = max(mp[i][k], mp[k][j]); } int main() { int n, m, t; while (scanf("%d%d%d", &n, &m, &t) != EOF) { int i, j; int a, b, h; for (i = 1; i <= n; ++i) for (j = 1; j <= n; ++j) mp[i][j] = INF; for (i = 0; i < m; ++i) { scanf("%d%d%d", &a, &b, &h); mp[a][b] = h; } floyd(n); for (i = 0; i < t; ++i) { scanf("%d%d", &a, &b); printf("%d\n", mp[a][b] == INF ? -1 : mp[a][b]); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/wenruo/p/4659494.html