POJ 2240 Arbitrage【Bellman_ford坑】
链接:
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 13067 | Accepted: 5493 |
Description
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 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
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-1 次
对于为什么是 N 或者 N-1 次一直没有理解清楚
code:
/*******************************************************
题意:判断是否存在使得汇率增多的环
【任意一个点的汇率增多都可以】
算法: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 简单变形
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坑】的更多相关文章
- POJ 2240 Arbitrage Bellman_ford 判读是否存在正环
和POJ1860差不多,就是用bellmanford判读是否存在正环,注意的是同种货币之间也可以交换,就是说:A货币换A货币汇率是2的情况也是存在的. #include<stdio.h> ...
- 最短路(Floyd_Warshall) POJ 2240 Arbitrage
题目传送门 /* 最短路:Floyd模板题 只要把+改为*就ok了,热闹后判断d[i][i]是否大于1 文件输入的ONLINE_JUDGE少写了个_,WA了N遍:) */ #include <c ...
- POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)
POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...
- poj 2240 Arbitrage 题解
Arbitrage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21300 Accepted: 9079 Descri ...
- poj 2240 Arbitrage (Floyd)
链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 Britis ...
- poj 2240 Arbitrage (最短路 bellman_ford)
题目:http://poj.org/problem?id=2240 题意:给定n个货币名称,给m个货币之间的汇率,求会不会增加 和1860差不多,求有没有正环 刚开始没对,不知道为什么用 double ...
- poj 2240 Arbitrage(Bellman_ford变形)
题目链接:http://poj.org/problem?id=2240 题目就是要通过还钱涨自己的本钱最后还能换回到自己原来的钱种. 就是判一下有没有负环那么就直接用bellman_ford来判断有没 ...
- POJ 2240 - Arbitrage(bellman_ford & floyd)
题意: 给出一些货币和货币之间的兑换比率,问是否可以使某种货币经过一些列兑换之后,货币值增加. 举例说就是1美元经过一些兑换之后,超过1美元.可以输出Yes,否则输出No. 分析: 首先我们要把货币之 ...
- POJ 2240 - Arbitrage - [bellman-ford求最短路]
Time Limit: 1000MS Memory Limit: 65536K Description Arbitrage is the use of discrepancies in currenc ...
随机推荐
- bootstrap -- meta中的viewport指令
在查看bootstrap教程中,碰到 <meta name="viewport" content="width=device-width, initial-scal ...
- linux -- 管道“|”
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入.连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入 ...
- 【甘道夫】通过Mahout构建贝叶斯文本分类器案例具体解释
背景&目标: 1.sport.tar 是体育类的文章,一共同拥有10个类别. 用这些原始材料构造一个体育类的文本分类器,并測试对照bayes和cbayes的效果: 记录分类器的构造 ...
- Erlang TCP Socket的接收进程的2种方案
转自:http://blog.csdn.net/summerhust/article/details/8740973 一旦打开了一个使用TCP连接的套接字,它就始终保持打开状态,直至任何一方关闭它或因 ...
- R语言绘图边框的单位
在R语言中指定画图边框时,通常使用两种单位, lines 和 inches 当然,这两个单位之间是可以相互转换的,那么 1 inch = ? line 答案是1 inches = 5 lines 下面 ...
- 本来想用jsonp来跨域请求的,但sb写接口的,不改返回值。。。只得在后台请求接口了。。。
string url = "ssss.com";//demo里的是get请求 HttpWebResponse w = HttpHelper.CreateGetHttpRespons ...
- luasql在Fedora20下的安装与使用示例
主要参考:http://www.boll.me/archives/614 luasql安装, 在终端通过yum命令安装: yum -y install lua-sql 接下来写个测试的lua脚本文件( ...
- Python使用paramiko库远程安全连接SSH
#!/usr/bin/python #ssh import paramiko import sys,os host='127.0.0.1' user = 'whl' password = ' s = ...
- 通过phoenix创建hbase表失败,创建语句卡住,hbase-hmaster报错:exception=org.apache.hadoop.hbase.TableExistsException: SYNC_BUSINESS_INFO_BYDAY_EFFECT
问题描述: 前几天一个同事来说,通过phoenix创建表失败了,一直报表存在的错误,删除也报错,然后就针对这个问题找下解决方案. 问题分析: 1.通过phoenix创建表,一直卡住不动了.创建语句如下 ...
- 文件打包为zip格式文件下载
整个思路是这样的: 1.查询数据库中的文件流放到datatable中2.循环datatable将文件流一个个生成文件,放到对应的文件夹中,3.下载某个文件夹下的所有文件a.循环这个文件夹下的所有文件, ...