floyd算法。这题目比较操蛋,首先INF需要比较大,我选择了INF = 0xffffffffffffff。还有一点就是%lld会挂掉的,用%I64d才能AC。
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int maxn = 105; __int64 INF = 0xffffffffffffff; __int64 x[maxn], jz[maxn][maxn], A[maxn][maxn]; int n, m; void floyd() { int i, j, k; for (i = 0; i <= n; i++) for (j = 0; j <= n; j++) A[i][j] = jz[i][j]; for (k = 1; k <= n; k++) { for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (k == i || k == j) continue; if (A[i][k] == INF || A[k][j] == INF) continue; else { if (A[i][k] + A[k][j] < A[i][j]) { A[i][j] = A[i][k] + A[k][j]; } } } } } } int main() { __int64 l1, l2, l3, l4, c1, c2, c3, c4; int i, j, sb, _; scanf("%d", &sb); for (_ = 1; _ <= sb; _++) { scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d%I64d", &l1, &l2, &l3, &l4, &c1, &c2, &c3, &c4); scanf("%d%d", &n, &m); for (i = 0; i <= n; i++) { for (j = 0; j <= n; j++) { if (i == j) jz[i][j] = 0; else jz[i][j] = INF; } } for (i = 1; i <= n; i++) scanf("%I64d", &x[i]); for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { if (i == j) continue; __int64 jl = abs(x[i] - x[j]); if (jl > 0 && jl <= l1){ jz[i][j] = c1; jz[j][i] = c1; } else if (jl > l1 && jl <= l2){ jz[i][j] = c2; jz[j][i] = c2; } else if (jl > l2 && jl <= l3) { jz[i][j] = c3; jz[j][i] = c3; } else if (jl > l3 && jl <= l4) { jz[i][j] = c4; jz[j][i] = c4; } } } floyd(); int u, v; printf("Case %d:\n", _); for (i = 0; i < m; i++) { scanf("%d%d", &u, &v); if (A[u][v] != INF)printf("The minimum cost between station %d and station %d is %I64d.\n", u, v, A[u][v]); else printf("Station %d and station %d are not attainable.\n", u, v); } } return 0; }
时间: 2024-10-13 18:14:56