链接:



Arbitrage
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 13067   Accepted: 5493

Description

Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a currency into more than one unit of the same currency. For example, suppose that 1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 French francs, and 1 French
franc buys 0.21 US dollar. Then, by converting currencies, a clever trader can start with 1 US dollar and buy 0.5 * 10.0 * 0.21 = 1.05 US dollars, making a profit of 5 percent. 



Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not. 

Input

The input will contain one or more test cases. Om the first line of each test case there is an integer n (1<=n<=30), representing the number of different currencies. The next n lines each contain the name of one currency. Within a name no spaces will appear.
The next line contains one integer m, representing the length of the table to follow. The last m lines each contain the name ci of a source currency, a real number rij which represents the exchange rate from ci to cj and a name cj of the destination currency.
Exchanges which do not appear in the table are impossible. 

Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.

Output

For each test case, print one line telling whether arbitrage is possible or not in the format "Case case: Yes" respectively "Case case: No".

Sample Input

3
USDollar
BritishPound
FrenchFranc
3
USDollar 0.5 BritishPound
BritishPound 10.0 FrenchFranc
FrenchFranc 0.21 USDollar 3
USDollar
BritishPound
FrenchFranc
6
USDollar 0.5 BritishPound
USDollar 4.9 FrenchFranc
BritishPound 10.0 FrenchFranc
BritishPound 1.99 USDollar
FrenchFranc 0.09 BritishPound
FrenchFranc 0.19 USDollar 0

Sample Output

Case 1: Yes
Case 2: No

Source



题意:


      判断是否存在使得汇率增多的环

    【任意一个点的汇率增多都可以】

算法:bellman_ford 判断“正环”

注意:

          这里的松弛操作要循环 N 次才能过,

       书上的松弛操作一直都是 N-1 次

       对于为什么是 N 或者 N-1 次一直没有理解清楚

code:

2240 Accepted 224K 110MS C++ 1781B

/*******************************************************
题意:判断是否存在使得汇率增多的环
【任意一个点的汇率增多都可以】
算法:bellman_ford 判断正环
注意:这里的松弛操作要循环 N 次才能过,
书上的松弛操作一直都是 N-1 次
对于为什么是 N 或者 N-1 次一直没有理解清楚
********************************************************/
#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
#include<algorithm>
#include<iostream>
using namespace std; const int maxn = 40;
double d[maxn];
int n,m; struct Edge{
int u,v;
double r;
}edge[maxn*maxn];
map<string, int> mp; bool bellman_ford(int s)
{
memset(d,0,sizeof(d));
d[s] = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 0; j < m; j++)
{
int u = edge[j].u;
int v = edge[j].v;
double r = edge[j].r;
if(d[v] < d[u]*r)
d[v] = d[u]*r;
}
}
if(d[s] > 1.0) return true;
else return false;
} int main()
{
int kcase = 0;
while(scanf("%d", &n) != EOF)
{
if(n == 0) break;
mp.clear(); string s;
for(int i = 1; i <= n; i++)
{
cin>>s;
mp[s] = i;
} scanf("%d", &m);
string s1,s2;
double rat;
for(int i = 0; i < m; i++)
{
cin>>s1>>rat>>s2;
edge[i].u = mp[s1];
edge[i].v = mp[s2];
edge[i].r = rat;
} bool flag = false;
for(int i = 1; i <= n; i++)
{
if(bellman_ford(i))
{
flag = true;
break;
}
}
printf("Case %d: ", ++kcase);
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}



还是用 floyd 简单方便了Orz

 /*******************************************************
题意:判断是否存在使得汇率增多的环
【任意一个点的汇率增多都可以】
算法:floyd 简单变形
w[i][j] = max(w[i][j], w[i][k]*w[k][j]) ********************************************************/
#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
#include<algorithm>
#include<iostream>
using namespace std; const int maxn = 40;
double d[maxn];
int n,m; double w[maxn][maxn];
map<string, int> mp; void floyd()
{
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
w[i][j] = max(w[i][j], w[i][k]*w[k][j]);
} int main()
{
int kcase = 0;
while(scanf("%d", &n) != EOF)
{
if(n == 0) break;
mp.clear(); string s;
for(int i = 1; i <= n; i++)
{
cin>>s;
mp[s] = i;
w[i][i] = 1; //自己到自己的汇率为 1, 注意这个初始化必须写在下面建图前面。。。
} scanf("%d", &m);
string s1,s2;
double rat;
for(int i = 0; i < m; i++)
{
cin>>s1>>rat>>s2;
w[mp[s1]][mp[s2]] = rat;
} floyd(); int flag = 0;
for(int i = 1; i <= n; i++)
{
if(w[i][i] > 1.0)
{
flag = 1; break;
}
}
printf("Case %d: ", ++kcase);
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}





POJ 2240 Arbitrage【Bellman_ford坑】的更多相关文章

  1. POJ 2240 Arbitrage Bellman_ford 判读是否存在正环

    和POJ1860差不多,就是用bellmanford判读是否存在正环,注意的是同种货币之间也可以交换,就是说:A货币换A货币汇率是2的情况也是存在的. #include<stdio.h> ...

  2. 最短路(Floyd_Warshall) POJ 2240 Arbitrage

    题目传送门 /* 最短路:Floyd模板题 只要把+改为*就ok了,热闹后判断d[i][i]是否大于1 文件输入的ONLINE_JUDGE少写了个_,WA了N遍:) */ #include <c ...

  3. POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)

    POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...

  4. poj 2240 Arbitrage 题解

    Arbitrage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 21300   Accepted: 9079 Descri ...

  5. poj 2240 Arbitrage (Floyd)

    链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 Britis ...

  6. poj 2240 Arbitrage (最短路 bellman_ford)

    题目:http://poj.org/problem?id=2240 题意:给定n个货币名称,给m个货币之间的汇率,求会不会增加 和1860差不多,求有没有正环 刚开始没对,不知道为什么用 double ...

  7. poj 2240 Arbitrage(Bellman_ford变形)

    题目链接:http://poj.org/problem?id=2240 题目就是要通过还钱涨自己的本钱最后还能换回到自己原来的钱种. 就是判一下有没有负环那么就直接用bellman_ford来判断有没 ...

  8. POJ 2240 - Arbitrage(bellman_ford & floyd)

    题意: 给出一些货币和货币之间的兑换比率,问是否可以使某种货币经过一些列兑换之后,货币值增加. 举例说就是1美元经过一些兑换之后,超过1美元.可以输出Yes,否则输出No. 分析: 首先我们要把货币之 ...

  9. POJ 2240 - Arbitrage - [bellman-ford求最短路]

    Time Limit: 1000MS Memory Limit: 65536K Description Arbitrage is the use of discrepancies in currenc ...

随机推荐

  1. android中文api(79)——Gallery

    前言 本章内容是 android.widget.Gallery,版本为Android 2.3 r1,翻译来自"henly.zhang",欢迎大家访问他的博客:http://www. ...

  2. jvm载入过程

    类载入过程 类从被载入到虚拟机内存中開始,到卸载出内存为止,它的整个生命周期包含:载入.验证.准备.解析.初始化.使用和卸载七个阶段.它们開始的顺序例如以下图所看到的: 当中类载入的过程包含了载入.验 ...

  3. Nginx的启动与停止,重启

    1.先确定nginx所在的文件位置 如: 重启 1.验证nginx配置文件是否正确 方法一:进入nginx安装目录sbin下,输入命令./nginx -t 2.重启Nginx服务 方法一:进入ngin ...

  4. Oracle-批量修改语句及相关知识点

    问: 有两张表A和B,结构相同,数据量一致,比如都有x,y和z列且都有n行,x为主键,完全相等,如何把表B的y列的数据赋值给A的y列? 我写的是1 update A set A.y=B.y where ...

  5. Solr学习之一 --------环境搭建

    一.准备工具 下载Solr,以目前最新版solr-6.1.0为例 准备servlet容器,Tomcat,Jetty,Resin之类.以Tomcat7为例   二.开始动手 将solr解压出来,在sol ...

  6. 类似股软(大智慧)之键盘精灵的 vc2008--UNICODE 环境实现

    键盘精灵是指,当按下键盘上任意一个数字.字母或符号的时候,都会弹出“键盘精灵”,其类似于股票软件(如大智慧)中的.可以在这里面输入中英文和数字搜索您想要的东西.可以通过输入代码.名称或名称的汉语拼音首 ...

  7. sql替换数据库字段中的字符

    UPDATE `table_name` SET `field_name` = replace (`field_name`,'from_str','to_str') WHERE ……说明:table_n ...

  8. Java精选笔记_XML基础

    XML基础 XML概述 W3C组织简介 W3C是World Wide Web Consortium(万维网联盟)的缩写,它是对网络标准定制的一个非赢利组织,如HTML.XHTML.CSS.XML的标准 ...

  9. laravel Eloquent 模型(也就是我本时说的Model)

    laravel的 Eloquent 模型其实就是我们平时说的MVC里Model,只是换了个名字而已~ 1)Eloquent 是啥? Eloquent 本质就一个查询构建器(laravel里叫查询构建器 ...

  10. 《C++ Primer Plus》第9章 内存模型和名称空间 学习笔记

    C++鼓励程序员在开发程序时使用多个文件.一种有效的组织策略是,使用头文件来定义用户类型,为操纵用户类型的函数提供函数原型,并将函数定义放在一个独立的源代码文件中.头文件和源代码文件一起定义和实现了用 ...