POJ 2240 - Arbitrage

来源:互联网 发布:c语言小游戏编程 编辑:程序博客网 时间:2024/06/06 04:32

题目大概意思是给你一些货币兑换关系,问你能不能通过换来换去赚到钱。当然TM是不可能的啦,不然我早就把VALVE买下来了。咳哼!回到正题,分析一下发现这题是图论。把每一种货币当作节点,每一种兑换关系当作单向路径,求是否存在正环,可以用Bellman - Ford解决。


//time 79ms//memory 252K#include <iostream>#include <cstdlib>#include <cstdio>using namespace std;#define INF (1<<30)double r[1010], d[32];int u[1010], v[1010];char cur[32][100];int search(int n, char tmp[100]){for (int i = 1; i <= n; ++i)if (strcmp(tmp, cur[i]) == 0)return i;return 0;}bool bellman(int n, int m){for (int k = 1; k <= n; ++k)for (int i = 1; i <= m; ++i)if (d[u[i]] < INF)d[v[i]] = d[v[i]] > d[u[i]] * r[i] ? d[v[i]] : d[u[i]] * r[i];if (d[1] > 1.0)return true;elsereturn false;}int main(){int n, count;for (count = 1;;count++){cin >> n;if (!n)break;memset(r, 0, sizeof(r));memset(cur, 0, sizeof(cur));for (int i = 1; i <= n; ++i)cin >> cur[i];int m;double rate;char x[100], y[100];cin >> m;for (int i = 1; i <= m; ++i){cin >> x >> rate >> y;u[i] = search(n, x);v[i] = search(n, y);r[i] = rate;}memset(d, 0, sizeof(d));d[1] = 1.0;printf("Case %d: ", count);if (bellman(n, m))printf("Yes\n");elseprintf("No\n");}return 0;}


0 0