hdu 1217 Arbitrage(佛洛依德)
Arbitrage
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6360 Accepted Submission(s):
2939
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.
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.
arbitrage is possible or not in the format "Case case: Yes" respectively "Case
case: No".
#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(佛洛依德)的更多相关文章
- 佛洛依德 c++ 最短路径算法
//20142880 唐炳辉 石家庄铁道大学 #include<iostream> #include<string> using namespace std; #define ...
- POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)
POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...
- HDU 1217 Arbitrage (Floyd)
Arbitrage http://acm.hdu.edu.cn/showproblem.php?pid=1217 Problem Description Arbitrage is the use of ...
- hdu 1217 Arbitrage (最小生成树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1217 /************************************************* ...
- HDU 1217 Arbitrage(Bellman-Ford判断负环+Floyd)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意:问你是否可以通过转换货币从中获利 如下面这组样例: USDollar 0.5 Brit ...
- hdu 1217 Arbitrage (spfa算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意:通过货币的转换,来判断是否获利,如果获利则输出Yes,否则输出No. 这里介绍一个ST ...
- [ACM] hdu 1217 Arbitrage (bellman_ford最短路,推断是否有正权回路或Floyed)
Arbitrage Problem Description Arbitrage is the use of discrepancies in currency exchange rates to tr ...
- hdu 1217 Arbitrage
Flody多源最短路 #include<cstdio> #include<cstring> #include<string> #include<cmath&g ...
- HDU 1217 Arbitrage(Floyd的应用)
给出一些国家之间的汇率,看看能否从中发现某些肮脏的......朋友交易. 这是Floyd的应用,dp思想,每次都选取最大值,最后看看自己跟自己的.....交易是否大于一.... #include< ...
随机推荐
- 洛谷P1263 宫廷守卫
P1263 宫廷守卫 题目描述 从前有一个王国,这个王国的城堡是一个矩形,被分为M×N个方格.一些方格是墙,而另一些是空地.这个王国的国王在城堡里设了一些陷阱,每个陷阱占据一块空地. 一天,国王决定在 ...
- spring源码学习之bean的加载(一)
对XML文件的解析基本上已经大致的走了一遍,虽然没有能吸收多少,但是脑子中总是有些印象的,接下来看下spring中的bean的加载,这个比xml解析复杂的多.这个加载,在我们使用的时候基本上是:Bea ...
- Mac下升级node到最新版本
建议先装n,再用n把node升级到最新稳定版: $ npm install -g n $ n stable
- 【笔记】http1.1支持的7种请求方法
本文是本人复习http协议整理笔记,以备后续查阅. http1.1支持的7种请求方法:get.post.head.options.put.delete.trace 在internet应用中,最常用的请 ...
- shell 向python传参数,空格引发的问题
昨天用一个shell脚本,调用一个python脚本,并把shell脚本中用 time1=`date "+%Y-%m-%d %H:%M:%S"`生成的时间戳作为参数,传到python ...
- TypeScript类型检查机制
类型推断 指不需要指定变量的类型,TS编译器可以根据某些规则自动推断出类型. 什么时候会有类型推断? 声明变量时没有指定类型 函数默认参数 函数返回值 ...... let a; // 这时自动推断为 ...
- DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER
原文:DirectX11笔记(八)--Direct3D渲染4--VERTEX SHADER 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u0103 ...
- B站直播 DEMO ijkplayerDemo
http://blog.csdn.net/kengsir/article/details/51750879 一. 下载ijkplayer ijkplayer下载地址 下载完成后解压, 解压后文件夹内部 ...
- java 操作CLOB类型数据
clob类型,但对于这个类型处理起来还是比较麻烦的,varchar2长度为4000bytes,如果varchar2能满足楼主的需求,建议使用varchar2,下面提供了在Java 中读取clob类型的 ...
- Linux的概述与分类
1.Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林纳斯·托瓦兹)起初开发的, ...