问题 E: 货币套汇

题目描述

套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币。例如,假定1 美元可以买0.7 英镑,1 英镑可以买9.5 法郎,1法郎可以买到0.16美元。通过货币兑换,一个商人可以从1 美元开始买入,得到0.7×9.5×0.16=1.064美元,从而获得6.4%的利润。 给定n种货币c1 ,c2 ,… ,cn的有关兑换率,试设计一个有效算法,确定货币间是否存在套汇的可能性。

提示:判断图上是否出现正环,即环上所有的边相乘大于1

输入

第一行:测试数据组数

每组测试数据格式为:

第一行:正整数n (1< =n< =30),正整数m,分别表示n种货币和m种不同的货币兑换率。

2~n+1行,n种货币的名称。

n+2~n+m+1行,每行有3 个数据项ci,rij 和cj ,表示货币ci 和cj的兑换率为 rij。

输出

对每组测试数据,如果存在套汇的可能则输出YES

如果不存在套汇的可能,则输出NO。

样例输入

2
3 3
USDollar
BritishPound
FrenchFranc
USDollar 0.5 BritishPound
BritishPound 10.0 FrenchFranc
FrenchFranc 0.21 USDollar
3 6
USDollar
BritishPound
FrenchFranc
USDollar 0.5 BritishPound
USDollar 4.9 FrenchFranc
BritishPound 10.0 FrenchFranc
BritishPound 1.99 USDollar
FrenchFranc 0.09 BritishPound
FrenchFranc 0.19 USDollar

样例输出

YES
NO

思路

弗洛伊德算法的逆用,多源(权值)最长路。

代码

#include<iostream>
#include<cstring>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
#define MAX 45
double path[MAX][MAX];
map<string,int>ratemap;bool Floyd(int n)
{for(int k=0;k<n;k++){for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(path[i][j]<path[i][k]*path[k][j])   //关键点path[i][j]=path[i][k]*path[k][j];//每个点到每个点的最大路径}}}for(int i=0;i<n;i++)//如果有正环if(path[i][i]>1)return true;return false;
}
int main()
{int n,m;string nameA,nameB,name;//tempdouble rate;int t;cin >> t;while(t--){cin >> n >> m;memset(path,0,sizeof(path));//path初始化为0for(int i=0;i<n;i++){//初始化键值对和矩阵(矩阵的对角线)cin>>name;pair<string,int>a(name,i);   //使用map结构可以直接得到该货币的索引ratemap.insert(a);path[i][i]=1;//表示有路}for(int i=0;i<m;i++){//给路径矩阵赋值cin>>nameA>>rate>>nameB;path[ratemap[nameA]][ratemap[nameB]]=rate;}if(Floyd(n)) cout<< "YES"<<endl;else cout<<"NO"<<endl;ratemap.clear();//清理键值对}return 0;
}

目的

一个笔记

问题 E: 货币套汇相关推荐

  1. 货币套汇(图路径)【数据结构-深度优先搜索-回路】

    这题感觉有点小难(估计还是我太菜 题目描述 套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币.例如,假定1 美元可以买0.7 英镑,1 英镑可以买9.5 法郎,1法郎可以买 ...

  2. 货币套汇(图路径)-- 数据结构 (深搜+Floyd算法)

    深搜+Floyd算法 深搜 Floyd算法 题目描述 套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币. 例如,假定1 美元可以买0.7 英镑,1 英镑可以买9.5法郎,1 ...

  3. 问题 D: 货币套汇(图路径)-- Guard

    题目描述 套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币.例如,假定1 美元可以买0.7 英镑,1 英镑可以买9.5 法郎,1法郎可以买到0.16美元.通过货币兑换,一个 ...

  4. PMCAFF微分享 | 供应链金融套利套汇介绍

    分享主题:供应链金融&套利套汇介绍 分享时间:7月4日(周六)21:30 分享地点:PMcaff互联网金融群|第七期 分享嘉宾:Julie Yao&Johnson 文字整理:May-天 ...

  5. 外汇交易方式与赚钱技巧 , 货币对的了解 , 如何建立稳定盈利

    外汇交易方式 外汇交易看似复杂,但实际归类性是很强的,只要把握这些规律,即便我们是新手,也可以在较短的时间内尝试到稳定赚钱的快乐! 即期外汇交易:又称现汇交易,是交易双方约定于成交后的两个营业日内办理 ...

  6. 算法设计与分析: 4-15 套汇问题

    4-15 套汇问题 问题描述 套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货 币.例如,假定 1 美元可以买 0.7 英镑,1 英镑可以买 9.5 法郎,且 1 法郎可以买 ...

  7. BF算法的实际应用 套汇

    如果没接触过bf算法,先看看它的介绍吧? bellman ford算法百度百科介绍 图中的加权有向边代表汇率,我们可以发现如果把 100 单位的货币 A 换成 B,再换成 C,最后换回 A,就可以得到 ...

  8. 【动态规划】套汇问题(Floyd算法)

    套汇是指利用货币汇兑率的差异将一个单位的某种货币转换为大于一个单位的同种货币.例如,假定1 美元可以买0.7 英镑,1 英镑可以买9.5 法郎,且1 法郎可以买到0.16美元.通过货币兑换,一个商人可 ...

  9. 牛客多校2 - Link with Game Glitch(spfa求正环,套汇,二分答案)

    https://ac.nowcoder.com/acm/contest/33187/D 题意 给定 n 种物品,一共 m 种转换方案. 每种转换方案给出四个数 a , b , c , d a, b, ...

最新文章

  1. OpenGL Cube Map立方体贴图的实例
  2. Oracle数据库迁移问题(备份、还原、数据导入导出、PLSQL)IMP - 0009 错误
  3. php 二进制 十六进制转换,php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码...
  4. 可视化卷积神经网络的过滤器
  5. 语言怎么得到直流电压并采样_热点|昆明专业12V10A开关电源怎么选
  6. Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类
  7. 【SPOJ - DQUERY】D-query【主席树 —— 区间中不同数的个数】
  8. 使用c语言实现数组连接
  9. 如何下载微博、B站(哔哩哔哩)视频到电脑
  10. 分析技术|3.2透射电子显微技术TEM
  11. 打字机效果的实现与应用
  12. Windows下cmd命令无法切换盘符
  13. 终极dos批处理循环命令详解
  14. 独立站好做吗?独立站跨境电商怎么做?
  15. 数字图像处理-美图秀秀:瘦脸算法
  16. python数据标准_python-StandardScaler数据标准化
  17. XXE漏洞详解(三)——XXE漏洞实际运用
  18. linux常用命令操作
  19. bat 当前目录下 子目录文件 移动到当前目录 并 文件改名 改后缀名
  20. Spring WebFlux

热门文章

  1. Arcgis启用https访问
  2. 手机u盘显示服务器连接超时,U盘插到手机里却没反应?这几种情况你知道么?...
  3. 【C++_OJ_指针】货币兑换(指针与常量)
  4. 关于计算机好处的英语小作文600字,电脑的重要性英语作文初一
  5. 四步完成win7 ubuntu双系统安装(硬盘,无需光驱)
  6. oracle账户locked, login denied解决办法
  7. dsplib-cfft
  8. qq空间模拟登录 php,php 模拟登陆
  9. 软件公司,销售管理门道(二)情报收集
  10. Confluence 决定(Decisions )蓝图