POJ 2240 解题报告
2011-05-07 18:34
417 查看
套汇差就是汇率的图中存在一条汇率乘积大于1的环。因为一开始已经明确是Bellman-Ford算法,所以把汇率c变成-log(c)付给边作权,这样就是看这个图是否存在权值和为负数的环,用该算法就非常地道了。
#include <cstdio> #include <cmath> #include <map> #include <string> using namespace std; struct tagTuple { // store edge info int u; int v; double w; }; int main() { int n, m, i, j, k; char buf1[1024], buf2[1024]; double weight; tagTuple edges[900]; double d[30]; bool still_init[30]; for (int t = 1; ;++t) { scanf("%d", &n); if (n == 0) { break; } // reading currency names, building map. std::map<std::string, int> cur_map; for (i = 0; i < n; ++i) { scanf("%s", buf1); cur_map[buf1] = i; } // reading exchange rates, building graph. scanf("%d", &m); for (i = 0; i < m; ++i) { scanf("%s%lf%s", buf1, &weight, buf2); edges[i].u = cur_map[buf1]; edges[i].v = cur_map[buf2]; edges[i].w = -log(weight); } // bellman-ford algorithm double tmp; for (i = 0; i < n; ++i) { memset(still_init, true, sizeof(still_init)); d[i] = 1.0; still_init[i] = false; for (j = 0; j < n - 1; ++j) { for (k = 0; k < m; ++k) { if (still_init[edges[k].u]) { continue; } tmp = d[edges[k].u] + edges[k].w; if (still_init[edges[k].v]) { d[edges[k].v] = tmp; still_init[edges[k].v] = false; } else if (d[edges[k].v] > tmp) { d[edges[k].v] = tmp; } } } int j; for (j = 0; j < m && (d[edges[j].v] <= d[edges[j].u] + edges[j].w + 1e-8); ++j); // 这里可能因为是浮点数,比较时要注意! if (j < m) { break; } } if (i < n) { printf("Case %d: Yes/n", t); } else { printf("Case %d: No/n", t); } } return 0; }
相关文章推荐
- POJ - 2240 Arbitrage解题报告
- POJ 1860 Currency Exchange + 2240 Arbitrage + 3259 Wormholes 解题报告
- POJ 3094 解题报告
- poj1001解题报告+测试数据
- POJ 1838 解题报告
- poj 3255 Roadblocks 次短路 spfa 解题报告
- POJ 1458(最长公共子序列 动态规划) 解题报告
- poj 1251 Jungle Roads 解题报告(kruskal+prim)
- poj解题报告——1003、1005、1799
- poj 1118 2606解题报告
- POJ 1316 解题报告
- POJ 2492 解题报告
- POJ 1411 Calling Extraterrestrial Intelligence Again 解题报告
- POJ 2159 解题报告
- 北大POJ解题报告-1003 Hangover
- POJ-2503 Babelfish 解题报告
- POJ 1661 解题报告
- poj解题报告——1002
- POJ 2255 Tree Recovery解题报告
- poj解题报告——3349