链接:



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. bson.errors.InvalidStringData: strings in documents must be valid UTF-8

    场景: pymongo 查询数据库的时候报错. for gscode in GSList_StockPool_Mongo_MktStop: self._collection_flash.find({& ...

  2. 关掉firefox(火狐)和palemoon地址栏自动加www.前缀功能【转】

    常用palemoon调试网站域名,它会很“贴心”的给你输入的网址前加上www.前缀,可有些域名前并没有www前缀,这样就导致了无法打开网站,今天学习下关闭它的这个功能. 打开firefox,在地址栏输 ...

  3. linux -- ubuntu 何为软件源

    新手学Ubuntu的时候,一般不知道什么是源,但源又是Ubuntu下常用到的东西.因此,本文就详细介绍一下Ubuntu 源. 什么是软件源? 源,在Ubuntu下,它相当于软件库,需要什么软件,只要记 ...

  4. MySQL 数据库常用命令小结

    MySQL 数据库常用命令 1.MySQL常用命令 create database name; 创建数据库 use databasename; 选择数据库 drop database name 直接删 ...

  5. App 应用通过网页打开 App Store

    NSURL *url = nil; if ([[[UIDevice currentDevice] systemVersion] intValue] >= 7.0) { //iOS7 使用旧的网址 ...

  6. [转]NMON服务器监控、指标说明

    一.NMON中的各项参数指标: SYS_SUMM:显示当前服务器的总体性能情况 Total System I/OStatistics:Avg tps during an interval:显示采集间隔 ...

  7. 一篇文看懂Hadoop

    我们很荣幸能够见证Hadoop十年从无到有,再到称王.感动于技术的日新月异时,希望通过这篇内容深入解读Hadoop的昨天.今天和明天,憧憬下一个十年. 本文分为技术篇.产业篇.应用篇.展望篇四部分 技 ...

  8. ubuntu-15.04-desktop-amd64.iso:ubuntu-15.04-desktop-amd64:安装Oracle11gR2

    ubuntu 桌面版的安装不介绍. 如何安装oracle:核心步骤和关键点. ln -sf /bin/bash /bin/sh ln -sf /usr/bin/basename /bin/basena ...

  9. Unity在协程内部停止协程自身后代码执行问题

    当在协程内部停止自身后,后面的代码块还会继续执行,直到遇到yield语句才会终止. 经测试:停止协程,意味着就是停止yield,所以在停止协程后,yield之后的语句也就不会执行了. 代码如下: us ...

  10. C语言文件路径中的”/“和“\“

    在不同系统的情况系   windows下是\,linux和unix下是/  但在win中没有本质区别. 但是由于   \   也是转义字符的起始字符,  所以, 路径中的   \   通常需要使用   ...