Ranking (as of 2013-01-19): 156
Language: C++
/* UVa 436 - Arbitrage (II) To build using Visual Studio 2008: cl -EHsc -O2 UVa_436_Arbitrage_II.cpp */ #include <iostream> #include <string> #include <map> #include <limits> #include <cmath> using namespace std; const int n_max = 30; double matrix[n_max][n_max]; void floyd_warshall(int n) { for (int k = 0; k < n; k++) for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (matrix[i][k] != numeric_limits<double>::max() && matrix[k][j] != numeric_limits<double>::max()) { double through_k = matrix[i][k] + matrix[k][j]; // distance through vertex k if (through_k < matrix[i][j]) matrix[i][j] = through_k; } } int main() { for (int case_nr = 1; ; case_nr++) { int n; cin >> n; if (!n) break; map<string, int> currencies; for (int i = 0; i < n; i++) { string c; cin >> c; currencies[c] = i; } for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) matrix[i][j] = (i == j) ? 0.0 : numeric_limits<double>::max(); int m; cin >> m; for (int i = 0; i < m; i++) { string ci, cj; double rij; cin >> ci >> rij >> cj; matrix[currencies[ci]][currencies[cj]] = -log(rij); } floyd_warshall(n); bool yes = false; for (int i = 0; i < n; i++) { double profit = 1.0 / exp(matrix[i][i]); if (profit > 1.0) { yes = true; break; } } cout << "Case " << case_nr << ((yes) ? ": Yes\n" : ": No\n"); } return 0; }
No comments:
Post a Comment