POJ 2240 Arbitrage

来源:互联网 发布:淘宝添加自定义属性 编辑:程序博客网 时间:2024/05/22 10:33

题目大意:

        n种货币(1 ≤ n ≤ 30),m组兑换方式(单向),对换方式的格式为"str_name1 r str_name2",其中前后两个str为货币的字符串名字(中间不含空格),r为汇率(为浮点数),现有多个测例,每个测例中给出n以及n中货币的名字,接着给出m以及m中对换方式,对于每个测例输出是否可以套汇,如果可以则输出"Yes"否则输出"No"。

        与POJ 1860 Currency Exchange类似! 

题目链接

代码:

/*                             * Problem ID : POJ 1860 Currency Exchange  * Author     : Lirx.t.Una                             * Language   : C++                  * Run Time   : 47 ms                             * Run Memory : 236 KB                            */   #include <iostream>#include <cstring>#include <string>#include <map>#defineMAXN30#define MAXM900using namespace std;struct Arc { int u, v; double r; };Arcarc[MAXM];doubledis[MAXN];inte;map<string,char>mp;voidaddarc( int u, int v, double r ) {arc[e].u = u;arc[e].v = v;arc[e].r = r;e++;}boolbelf(int n) {boolcont;intk, i;doubletmp;cont = true;for ( k = 1; k <= n; k++ )for ( cont = false, i = 0; i < e; i++ )if ( ( tmp = dis[ arc[i].u ] * arc[i].r ) > dis[ arc[i].v ] ) {if ( k == n ) return true;dis[ arc[i].v ] = tmp;cont = true;}return false;}intmain() {intiscn;intn, m;intu, v;inti;doubler;stringstr;iscn = 0;while ( scanf("%d", &n), n ) {memset(dis, 0, sizeof(dis));dis[0] = 1.0;for ( i = 0; i < n; i++ ) {cin >> str;mp[str] = i;}e = 0;scanf("%d", &m);while ( m-- ) {cin >> str;u = mp[str];scanf("%lf", &r);cin >> str;v = mp[str];addarc( u, v, r );}printf("Case %d: ", ++iscn);if ( belf(n) ) puts("Yes");else puts("No");}return 0;}

0 0
原创粉丝点击