[ACM] hdu 1217 Arbitrage (bellman_ford最短路,推断是否有正权回路或Floyed)
Arbitrage
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 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.
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
Case 1: Yes
Case 2: No
解题思路:
方法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)的更多相关文章
- [ACM] POJ 3259 Wormholes (bellman-ford最短路径,推断是否存在负权回路)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 29971 Accepted: 10844 Descr ...
- POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)
POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...
- Bellman_ford货币兑换——正权回路判断
POJ1860 题目大意:你在某一点有一些钱,给定你两点之间钱得兑换规则,问你有没有办法使你手里的钱增多.就是想看看转一圈我的钱能不能增多,出现这一点得条件就是有兑换钱得正权回路,所以选择用bellm ...
- 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 ...
- Spfa 求含负权边的最短路 + 判断是否存在负权回路
在Bellman-Ford算法之后,我们总算迎来了spfa算法,其实就如同堆优化Dijkstra算法之于朴素版Dijkstra算法,spfa算法仅仅是对Bellman-Ford算法的一种优化,但是在形 ...
- hdu 1217 Arbitrage(佛洛依德)
Arbitrage Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
随机推荐
- pycharm安装包
pycharm的纯净版本 链接: https://pan.baidu.com/s/15fLsO_GCO8uaYNQjLVdNaw 密码: ef22
- dev c++ 提示没有iostream.h文件
dev c++ 提示没有iostream.h文件 解决办法路径没有打通最好是这样写:#include <iostream>using namespace std;int main(int ...
- [译]PYTHON FUNCTIONS - MAP, FILTER, AND REDUCE
map, filter, and reduce Python提供了几个函数,使得能够进行函数式编程.这些函数都拥有方便的特性,他们可以能够很方便的用python编写. 函数式编程都是关于表达式的.我们 ...
- 零基础自学用Python 3开发网络爬虫
原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...
- Spring整合Junit进行单元测试
I. 加入依赖包 Spring Test (如spring-test-2.5.4.jar) JUnit 4 Spring 其他相关包 II.新建Junit Test Case III.读取配置文件 @ ...
- background-position-x和background-position-y的兼容性问题
一.语法: background-position-x : length | left | center | right background-position-y : length | left | ...
- 网抓(XML Http Request、VBA)实现
第一种,先看VBA Public Function GetInfo(strMoblie As String) As String '创建对象 Dim xmlHttp As Object Set xml ...
- 使用 Spring Boot 2.0 + WebFlux 实现 RESTful API
概述 什么是 Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发框架. 要深入了解 Spring WebFlux, 首先要了知道 R ...
- word文档的导出(用freemarker模板导出)(桃)
1.将要导出的word文档另存为xml格式的 2.用文档编辑器打开(如:notepad++),将要展示的数据用${name}的形式替换,“name”对应数据库中的字段 3.根据模板生成 package ...
- C语言中的数组的访问方式
闲下来,写的代码,很是简单,不解释,代码如下: #include <stdio.h> int main(int argc, char **argv) { char cArray[] = & ...