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. day03_09 编码部分历史及文件编码简介

    详细课件:http://www.cnblogs.com/alex3714/articles/5465198.html 字符编码 支持中文的第一张表就是GB2312 1980 gb2312 6700+ ...

  2. 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索

    题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...

  3. 听说你的模型损失是NaN

    听说你的模型损失是NaN 有时候,模型跑着跑着,损失就莫名变NaN了.不过,经验告诉我们,大部分NaN主要是因为除数是0或者传给log的数值不大于0.下面说说是log出NaN的几种常见解决方法. 毕竟 ...

  4. TOJ4168: Same Digits

    4168: Same Digits  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 11 ...

  5. AtCoder Petrozavodsk Contest 001

    第一场apc,5H的持久战,我当然水几个题就睡了 A - Two Integers Time limit : 2sec / Memory limit : 256MB Score : 100 point ...

  6. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  7. hdu 6021 MG loves string

    MG loves string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others ...

  8. 洛谷 [P2859] 摊位预定

    贪心 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm ...

  9. CodeForces 333E. Summer Earnings

    time limit per test 9 seconds memory limit per test 256 megabytes input standard input output standa ...

  10. 【CF739B】Alyona and a tree(树上差分,二分,树形DP)

    题意:给出一棵有根树,树上每个点.每条边都有一个权值. 现在给出“控制”的定义:对一个点u,设点v在其子树上,且dis(u,v)≤av,则称u控制v. 要求求出每个点控制了多少个点 n (1 ≤ n  ...