Ranking (as of 2014-09-14): 76 out of 613
Language: C++
/* UVa 10246 - Asterix and Obelix To build using Visucal Studio 2012: cl -EHsc UVa_10246_Asterix_and_Obelix.cpp */ #include <algorithm> #include <limits> #include <cstdio> using namespace std; const int C_max = 80; int feasts[C_max + 1]; int fcosts[C_max + 1][C_max + 1], pcosts[C_max + 1][C_max + 1]; void floyd_warshall(int n) { for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) if (pcosts[i][k] != numeric_limits<int>::max()) for (int j = 1; j <= n; j++) if (pcosts[k][j] != numeric_limits<int>::max()) { if (pcosts[i][k] + pcosts[k][j] + max(fcosts[i][k], fcosts[k][j]) < pcosts[i][j] + fcosts[i][j]) { pcosts[i][j] = pcosts[i][k] + pcosts[k][j]; fcosts[i][j] = max(fcosts[i][k], fcosts[k][j]); } } } int main() { bool printed = false; for (int cn = 1; ; cn++) { int C, R, Q; scanf("%d %d %d", &C, &R, &Q); if (!C && !R && !Q) break; if (printed) putchar('\n'); else printed = true; for (int i = 1; i <= C; i++) scanf("%d", &feasts[i]); for (int i = 1; i <= C; i++) for (int j = 1; j <= C; j++) if (i != j) { pcosts[i][j] = numeric_limits<int>::max(); fcosts[i][j] = 0; } else { pcosts[i][i] = 0; fcosts[i][i] = feasts[i]; } while (R--) { int c1, c2, d; scanf("%d %d %d", &c1, &c2, &d); pcosts[c1][c2] = pcosts[c2][c1] = d; fcosts[c1][c2] = fcosts[c2][c1] = max(feasts[c1], feasts[c2]); } floyd_warshall(C); floyd_warshall(C); printf("Case #%d\n", cn); while (Q--) { int c1, c2; scanf("%d %d", &c1, &c2); int min_d = numeric_limits<int>::max(); printf("%d\n", ((pcosts[c1][c2] != numeric_limits<int>::max()) ? pcosts[c1][c2] + fcosts[c1][c2] : -1)); } } return 0; }
No comments:
Post a Comment