Arbitrage

Problem 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 file 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

解题思路:

方法1:

一种货币经过兑换其他的货币,经过几轮兑换。终于回到该货币,使其价值变大,这就是“套利”。採用bellman_ford算法。不是求对短路,求最大获利。在bellman算法上修改。

推断是否含有正权回路。

代码:

#include <iostream>
#include <string.h>
using namespace std;
const int maxn=35;
double dis[maxn];
string str[maxn];
int nodeNum,edgeNum; struct Edge
{
int s,e;
double w;
}edge[maxn*maxn]; bool bellman_ford(int start)
{
for(int i=1;i<=nodeNum;i++)
dis[i]=0;//修改1
dis[start]=1;
bool ok;
for(int i=1;i<=nodeNum-1;i++)
{
ok=0;
for(int j=1;j<=edgeNum;j++)
{
if(dis[edge[j].s]*edge[j].w>dis[edge[j].e])//修改2
{
dis[edge[j].e]=dis[edge[j].s]*edge[j].w;
ok=1;
}
}
if(!ok)
break;
}
for(int i=1;i<=edgeNum;i++)
if(dis[edge[i].s]*edge[i].w>dis[edge[i].e])
return true;
return false;
} int main()
{
int c=1;
while(cin>>nodeNum&&nodeNum)
{
for(int i=1;i<=nodeNum;i++)
cin>>str[i];
cin>>edgeNum;
string from,to;
double w;
for(int i=1;i<=edgeNum;i++)
{
cin>>from>>w>>to;
int j,k;
for(j=1;j<=nodeNum;j++)
if(from==str[j])
break;
for(k=1;k<=nodeNum;k++)
if(to==str[k])
break;
edge[i].s=j;
edge[i].e=k;
edge[i].w=w;
}
if(bellman_ford(1))
cout<<"Case "<<c++<<": Yes"<<endl;
else
cout<<"Case "<<c++<<": No"<<endl;
}
return 0;
}

方法二:

建立图,邻接矩阵,求随意两条边之间的最短路,假设dis[i][i]>1 的话。说明存在正权回路。代码中使用到了map, 字符串到整型编号的映射

代码:

#include <iostream>
#include <map>
#include <string.h>
using namespace std;
const int maxn=40;
string str[maxn];
double mp[maxn][maxn];
int nodeNum,edgeNum; void floyed()
{
for(int k=1;k<=nodeNum;k++)
for(int i=1;i<=nodeNum;i++)
for(int j=1;j<=nodeNum;j++)
{
if(mp[i][j]<mp[i][k]*mp[k][j])
mp[i][j]=mp[i][k]*mp[k][j];
}
} int main()
{
int c=1;
while(cin>>nodeNum&&nodeNum)
{
map<string,int>st;
for(int i=1;i<=nodeNum;i++)
{
cin>>str[i];
st[str[i]]=i;
}
for(int i=1;i<=nodeNum;i++)
for(int j=1;j<=nodeNum;j++)
{
if(i==j)
mp[i][j]=1;
else
mp[i][j]=0;
}
cin>>edgeNum;
string from,to;double w;
for(int i=1;i<=edgeNum;i++)
{
cin>>from>>w>>to;
mp[st[from]][st[to]]=w;
}
floyed();
bool ok=0;
for(int i=1;i<=nodeNum;i++)
if(mp[i][i]>1)
ok=1;
if(ok)
cout<<"Case "<<c++<<": Yes"<<endl;
else
cout<<"Case "<<c++<<": No"<<endl;
}
return 0;
}

[ACM] hdu 1217 Arbitrage (bellman_ford最短路,推断是否有正权回路或Floyed)的更多相关文章

  1. [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 29971   Accepted: 10844 Descr ...

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

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

  3. Bellman_ford货币兑换——正权回路判断

    POJ1860 题目大意:你在某一点有一些钱,给定你两点之间钱得兑换规则,问你有没有办法使你手里的钱增多.就是想看看转一圈我的钱能不能增多,出现这一点得条件就是有兑换钱得正权回路,所以选择用bellm ...

  4. HDU 1217 Arbitrage (Floyd)

    Arbitrage http://acm.hdu.edu.cn/showproblem.php?pid=1217 Problem Description Arbitrage is the use of ...

  5. hdu 1217 Arbitrage (最小生成树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1217 /************************************************* ...

  6. HDU 1217 Arbitrage(Bellman-Ford判断负环+Floyd)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意:问你是否可以通过转换货币从中获利 如下面这组样例: USDollar 0.5 Brit ...

  7. hdu 1217 Arbitrage (spfa算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意:通过货币的转换,来判断是否获利,如果获利则输出Yes,否则输出No. 这里介绍一个ST ...

  8. Spfa 求含负权边的最短路 + 判断是否存在负权回路

    在Bellman-Ford算法之后,我们总算迎来了spfa算法,其实就如同堆优化Dijkstra算法之于朴素版Dijkstra算法,spfa算法仅仅是对Bellman-Ford算法的一种优化,但是在形 ...

  9. hdu 1217 Arbitrage(佛洛依德)

    Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

随机推荐

  1. 淘宝的TProfile分析

    TProfile是一个用来抓取性能数据的工具.大概是去年的时候对其分析了一下,并将它改造成了用于分析学习开源产品时的一个trace工具(不是很完善,自己用够用).现在将之前的笔记翻出来,记录一下. 1 ...

  2. python 学习分享-文件操作篇

    文件操作 f_open=open('*.txt','r')#以只读的方式(r)打开*.txt文件(需要与py文件在同一目录下,如果不同目录,需写全路径) f_open.close()#关闭文件 打开文 ...

  3. custom post types 404 Page Error

    问题: 注册新的文章类型后,用新的类型写文章,打开后报 404 错误 原因: 因为虽然注册了新的帖子类型,但WordPress还不知道如何处理它 解决: 到设置 -> 固定链接,重新点击保存,再 ...

  4. javascript学习笔记 - 引用类型 单体内置对象

    七 单体内置对象 1.Global对象 不属于任何对象的属性和方法,都归于它.全局作用域中定义的变量.函数,都属于Global对象 1.1 URI编码  encodeURI <=>deco ...

  5. 【Istio】error initializing configuration '/etc/istio/proxy/envoy-rev0.json': malformed IP address: istio-statsd-prom-bridge

    今天遇到一个问题,istio的组件一直在重启,查看log大概是这个样子 --03T07::.935580Z info Epoch starting --03T07::.936317Z info Env ...

  6. POJ 1609 Tiling Up Blocks

    Tiling Up Blocks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4675   Accepted: 1824 ...

  7. iOS----OC特性-特殊功能宏

    1.NS_ASSUME_NONNULL_BEGIN && NS_ASSUME_NONNULL_END 在Swift中存在Option类型,也就是使用?和!声明的变量.但是OC里面没有这 ...

  8. Python Base Two

    //fourth day to study python 24. In python , how to create funcation. we can use def to define funca ...

  9. GC overhead limit exceeded,tomcat修改jvm内存

    tomcat修改jvm内存 内存大小:-Xms256M -Xmx512M -XX:PermSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=512m -Dja ...

  10. 【CF1027A】Palindromic Twist(模拟)

    题意:输入T组字符串,每个字符串都必须改变一次,每个字母改变的规则是变成相邻的字母,字母a只能变b,z只能变y,判断改变后的字符依旧是否能够变成回文串 n<=1e2 思路: #include&l ...