codeforces 189D AlgoRace

来源:互联网 发布:java 字符串截取 编辑:程序博客网 时间:2024/05/01 04:37

有m种车,给定每种车从城市i到城市j的时间话费cost[i][j],有 r 个询问,每次询问从 i 到 j ,最多换 k 次车类型的最小时间花费


用cost[i][j][k]表示用第 i 种车,从j 走到 k的最小花费,读入花费矩阵之后,注意用floyd预处理,保证cost[i][j][k]是最优。然后用f[i][j][k] 表示换i 次车从 j 到k 的最优解,然后每次询问直接输出就行


#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#define rep(i, j, k) for(ll i = j; i <= k; i++)#define ll long long#define maxn 1000009#define inf 0x7fffffff/2using namespace std;int n, m, r, f[1009][61][61], cost[62][62][62];int main (){cin >> n >> m >> r;rep (i, 1, m)rep (j, 1, n)rep (k, 1, n)scanf ("%d", &cost[i][j][k]);rep (i, 1, m)rep (k, 1, n)rep (u, 1, n)rep (v, 1, n)cost[i][u][v] = min (cost[i][u][v], cost[i][u][k] + cost[i][k][v]);rep (i, 0, n)rep (j, 1, n)rep (k, 1, n)f[i][j][k] = inf;rep (k, 1, m)rep (i, 1, n)rep (j, 1, n)rep (w, 1, n)f[0][i][j] = min (f[0][i][j], cost[k][i][w] + cost[k][w][j]);/*cout << endl;for (int i = 1; i <= n; i++, cout << endl)rep (j, 1, n)printf ("%d ", f[0][i][j]);*/rep (i, 1, n)rep (w, 1, n)rep (j, 1, n)rep (k, 1, n)f[i][j][k] = min (f[i][j][k], f[i - 1][j][w] + f[0][w][k]);while (r--){int u, v, w;scanf ("%d%d%d", &u, &v, &w);w = min (w, n);int ret = inf;rep (i, 0, w)ret = min (ret, f[i][u][v]);printf ("%d\n", ret);}return 0;}


0 0
原创粉丝点击