Arbitrage

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6360    Accepted Submission(s):
2939

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
 
Recommend
Eddy   |   We have carefully selected several similar
problems for you:  1142 1162 1385 1301 1596 
 
最短路的变形,由于数据只到30,所以可以采用floyd算法,不过需要注意的是,这里是求最大的倍率。
 
题意:题目大意就是给了你各种货币之间的兑换关系,问你是否存在1个单元的某货币经过一个回路的兑换后>=1个单元( 有利润 )。
 
附上代码:
 
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define M 35
using namespace std;
double map[M][M];
int n; void floyd() //利用floyd算法计算最大赔率
{
int k,i,j;
for(k=; k<=n; k++)
for(i=; i<=n; i++)
for(j=; j<=n; j++)
if(map[i][j]<map[i][k]*map[k][j])
map[i][j]=map[i][k]*map[k][j];
} int main()
{
int m,i,j,w=;
char s[M],str[M][M];
while(~scanf("%d",&n)&&n)
{
for(i=; i<=n; i++)
scanf("%s",str[i]);
for(i=; i<=n; i++)
for(j=; j<=n; j++)
{
if(i==j) map[i][j]=; //因为是找最大的汇率,因此初始时本身转本身为1,其他转化为0
else map[i][j]=;
}
scanf("%d",&m);
int a,b;
double c;
for(i=; i<=m; i++)
{
scanf("%s",s);
for(a=; a<=n; a++) //将其转化为map数组记录
if(!strcmp(s,str[a]))
break;
scanf("%lf",&c);
scanf("%s",s);
for(b=; b<=n; b++)
if(!strcmp(s,str[b]))
break;
map[a][b]=c;
}
floyd();
cout<<"Case "<<w++<<": ";
if(map[][]>)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return ;
}

邻接表:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 35
#define M 35*35*10
#define INF 0x3f3f3f3f
using namespace std;
struct Edge
{
int from,to;
double val;
int next;
} edge[M*];
int n,m,tol,s,t,fail;
double dis[N];
bool vis[N];
int head[M*]; void init()
{
tol=;
memset(head,-,sizeof(head));
} void addEdge(int u,int v,double w)
{
edge[tol].from=u;
edge[tol].to=v;
edge[tol].val=w;
edge[tol].next=head[u];
head[u]=tol++;
} void getmap()
{
char str[N][N];
char s[N];
for(int i=; i<=n; i++)
scanf("%s",str[i]);
int a,b;
double c;
scanf("%d",&m);
while(m--)
{
scanf("%s",s);
for(a=; a<=n; a++)
if(!strcmp(s,str[a]))
break;
scanf("%lf",&c);
scanf("%s",s);
for(b=; b<=n; b++)
if(!strcmp(s,str[b]))
break;
addEdge(a,b,c);
}
memset(vis,false,sizeof(vis));
memset(dis,,sizeof(dis));
} void spfa()
{
queue<int>q;
q.push();
dis[]=1.0;
vis[]=true;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u]; i!=-; i=edge[i].next)
{
int v=edge[i].to;
if(dis[v]<dis[u]*edge[i].val)
{
dis[v]=dis[u]*edge[i].val;
if(!vis[v])
{
vis[v]=true;
q.push(v);
}
if(dis[]>)
{
fail=;
return;
} }
}
} } int main()
{ int i,j,T=;
while(~scanf("%d",&n)&&n)
{
init();
getmap();
printf("Case %d: ",T++);
fail=;
spfa();
if(fail)
printf("Yes\n");
else
printf("No\n");
}
return ;
}

hdu 1217 Arbitrage(佛洛依德)的更多相关文章

  1. 佛洛依德 c++ 最短路径算法

    //20142880 唐炳辉 石家庄铁道大学 #include<iostream> #include<string> using namespace std; #define ...

  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. HDU 1217 Arbitrage (Floyd)

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

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

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

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

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

  6. hdu 1217 Arbitrage (spfa算法)

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

  7. [ACM] hdu 1217 Arbitrage (bellman_ford最短路,推断是否有正权回路或Floyed)

    Arbitrage Problem Description Arbitrage is the use of discrepancies in currency exchange rates to tr ...

  8. hdu 1217 Arbitrage

    Flody多源最短路 #include<cstdio> #include<cstring> #include<string> #include<cmath&g ...

  9. HDU 1217 Arbitrage(Floyd的应用)

    给出一些国家之间的汇率,看看能否从中发现某些肮脏的......朋友交易. 这是Floyd的应用,dp思想,每次都选取最大值,最后看看自己跟自己的.....交易是否大于一.... #include< ...

随机推荐

  1. 洛谷P1072 [NOIP2009] Hankson 的趣味题

    P1072 Hankson 的趣味题 题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一 ...

  2. PHP通过sql生成CSV文件并下载,PHP实现文件下载

    /** * PHP通过sql生成CSV文件并下载 * @param string $sql 查询sql,结果为二维数组 * @param array $title 数据,CSV文件标题 * @para ...

  3. Djangog写XXOO管理的要求以及思路

  4. Vue.之.安装

    Vue.之.安装 第一步npm安装 首先:先从nodejs.org中下载nodejs   直到Finish完成安装. 打开控制命令行程序(CMD),检查是否正常 使用淘宝NPM 镜像 国内直接使用np ...

  5. word之图表目录中点号位置提升3磅

  6. laravel 图片

    /** * 缩略图上传 */ public static function addPic() { $inputData = request()->all(); $rules = [ 'main_ ...

  7. Directx11教程(51) 简单的billboard

    原文:Directx11教程(51) 简单的billboard        billboard称作公告板,通常用一个quad(四边形)表示[有的billboard用两个正交的quad表示],它的特点 ...

  8. SSM框架用JSON进行前后端数据传输

    一个根据用户id查找用户信息的简单功能,使用JSON进行数据的传输 前端代码 这里用bootstrap做简单的样式美化,中间留了个div用来异步的显示查询结果,ajax进行前端的数据传输(class内 ...

  9. Person Re-identification 系列论文笔记(八):SPReID

    Human Semantic Parsing for Person Re-identification Kalayeh M M, Basaran E, Gokmen M, et al. Human S ...

  10. HDU 4217

    点击打开题目链接 题型就是数据结构.给一个数组,然后又k次操作,每次操作给定一个数ki, 从数组中删除第ki小的数,要求的是k次操作之后被删除的所有的数字的和. 简单的思路就是,用1标记该数没有被删除 ...