套利是利用货币汇率的差异将一种货币的一个单位转换为同一货币的多个单位。例如,假设1美元兑0.5英镑,1英镑兑10.0法国法郎,1法国法郎兑0.21美元。然后,通过兑换货币,一个聪明的交易者可以从1美元开始购买0.5 * 10.0 * 0.21 = 1.05美元,赚取5%的利润。

您的工作是编写一个程序,该程序以货币汇率列表作为输入,然后确定套利是否可能。

输入

输入文件将包含一个或多个测试用例。每个测试用例的第一行有一个整数n (1<=n<=30),表示不同货币的数量。接下来的n行每一行都包含一种货币的名称。在名称中不会出现空格。下一行包含一个整数m,表示接下来的表的长度。最后m行分别包含源货币的名称ci、表示从ci到cj的汇率的实数rij和目标货币的名称cj。不出现在表中的交换是不可能的。

测试用例之间用空行隔开。对于n,输入以0(0)结束。

输出

对于每个测试用例,用“case case: Yes”和“case case: No”的格式打印一行代码,说明套利是否可能。

样例输入
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

分析与解答:

这题利用SPFA,但是不同于一般的SPFA。
一般我们用SPFA是给一个起点我们用dis[i]存起点到终点i的最短距离。
Map[a][b]=k,a换到b的汇率
Map[a][a]=1,意思是a换到a的汇率为1
dis[a]=j,起点换到a的汇率的最大值
先明白一个基本常识,a换到b汇率为x,b换到c汇率为y,那么a换到c汇率为x*y。然而路径是相加的
所以这个题用SPFA时候,我们初始化变了,我们判断条件也变了,而且根据题意除了存dis数组之外,我们还需要判断dis[start]是不是大于1

为什么dis[start]会变?这就是SPFA算法和bfs的区别,bfs是x出队之后就不入队了,而SPFA中,一个点改进过其它的点之后,过了一段时间可能本身被改进(重新入队),于是再次用来改进其它的点

参考代码:
https://blog.csdn.net/lyhvoyage/article/details/19248927

#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<string>
#include<iostream>
using namespace std;const int N = 35;
int n, m;
double  d[N], Map[N][N];
int SPFA(int start)
{queue<int> q;bool inq[N];for(int i = 0; i < n; i++)d[i] = 0;memset(inq, 0, sizeof(inq));d[start] = 1;q.push(start);while(!q.empty()){int x = q.front(); q.pop();inq[x] = false;for(int i = 0; i < n; i++){if(d[i] < d[x] * Map[x][i]){d[i] = d[x] * Map[x][i];if(d[start] > 1.0)return 1;if(!inq[i]){inq[i] = true;q.push(i);}}}}return 0;
}int main()
{int i, j, cas = 0;char s1[35], s2[35];double s;map<string,int> mp;while(~scanf("%d",&n) && n){for(i = 0; i < n; i++){for(j = 0; j < n; j++){if(i == j)Map[i][j] = 1;elseMap[i][j] = 0;}}string name;for(i = 0; i < n; i++){cin>>name;mp[name]=i;}scanf("%d",&m);for(i = 0; i < m; i++){scanf("%s%lf%s",s1, &s, s2);Map[mp[s1]][mp[s2]] = s;}int flag = 0;for(i = 0; i < n; i++){if(SPFA(i) == 1){flag = 1;break;}}printf("Case %d: ",++cas);printf("%s\n", flag ? "Yes" : "No");}return 0;
}

(SPFA+最短路变形+回路对起点的影响)Arbitrage相关推荐

  1. 算法提高课-图论-单源最短路的建图方式-AcWing 1127. 香甜的黄油:spfa最短路

    题目分析 来源:acwing 分析: 多源汇最短路.所以我们首先想到的是floyd算法, 可是它的复杂度是O(n3)O(n^3)O(n3),会超时.所以我们需要另外考虑. 任意一个点作为起点求出到所有 ...

  2. 差分约束系统之Bellman_Ford与Spfa判断负权回路

    题目:http://poj.org/problem?id=1364 题意:就是简单的差分约束模型. 分析:首先我们必须知道,如果图中存在负权回路,那么差分约束没有可行解.而存在负权回路的条件是:图中某 ...

  3. poj 2263 最短路变形——最小边的最大值

    文章目录 本题:最短路变形--最小边的最大值 最短路变形--最大边的最小值 本题:最短路变形--最小边的最大值 最短路变形--最大边的最小值 poj2253

  4. poj 2253 最短路变形——最大边的最小值

    文章目录 本题:最短路变形--最大边的最小值 最短路变形--最小边的最大值 本题:最短路变形--最大边的最小值 题意: 给出两只青蛙.以及其他石头的坐标,需要求出可以到达另一只青蛙的所有路径中,青蛙跳 ...

  5. 【图论-最短路变形】想越狱的小杉

    [图论-最短路变形]想越狱的小杉 Time Limit:1000MS  Memory Limit:65536K Description 背景 Background 这次小杉来到了经典美剧<越狱& ...

  6. Gym-100851F Froggy Ford 最短路变形 dijkstra || spfa

    题意:有条宽为w的河流,两岸分别在x = 0, x = w处,河中间有n个石头.在河的左岸有一只青蛙想通过石头跳到对岸去.现在可以在河中间某个位置多加一块石头,使得青蛙在单步跳跃中的最大值最小,问应在 ...

  7. nyoj 307(最短路变形)

    解题思路:这道题和上一道题一样,也是最短路的变形,我之前的想法是二分答案,然后再dp去判断是否可以满足要求,但发现这样子的话会存在问题:因为一条路可能走多次,就无法保证其后效性. 看了别人的思路:先以 ...

  8. poj 1797(最短路变形)

    题目链接:http://poj.org/problem?id=1797 思路:题目意思很简单,n个顶点,m条路,每条路上都有最大载重限制,问1->n最大载重量.其实就是一最短路的变形,定义wei ...

  9. [ICPC Asia Nanjing 2019] Holy Grail (spfa最短路)

    题意:给出一个n个点,m条边的有向图,再给6组询问,在u,v间建一条权值最小的边,使图中没有负环.保证有解. 做法:u,v加边,如果有负环必定过u,v.以v为起点,到u的最短路和u->v组成的环 ...

最新文章

  1. iOS:quartz2D绘图(给图形绘制阴影)
  2. 搜索引擎提交注意事项
  3. 如何在excel中判断某一点在某一区域内_SEM优化师常用的Excel表格函数集合
  4. 互联网日报 | 3月12日 星期五 | 京东全年净增1.1亿活跃用户;百度计划3月23日登陆港交所;中国联通首次公布5G用户数...
  5. 自己写个扩展把Mootools的语法改的和Jquery的语法一模一样
  6. Android下播放YUV视频文件
  7. jQueryWEUI自定义对话框-带有textarea
  8. linux下svn命令使用大全
  9. 小米5SPLUS Android9.0,小米5S Plus线刷MIUI9的教程_小米5SPlus MIUI9系统刷机包
  10. python打造微信聊天机器人_求问各位大佬,如何用Python写一款微信聊天机器人?...
  11. 【粗解】【通信编码】卷积编码器的简单实现
  12. kindle的xray怎么用_kindle的x-ray有什么用
  13. EndNote X9破解之后遇到的问题
  14. 计算机后端维护,机房智能交通后台系统运行维护内容.doc
  15. java小红球下载_小红球闯关下载_小红球闯关合集版下载-游戏下载
  16. Windows使用批处理文件更改指定目录下的文件名(含序号)
  17. 千古兴亡多少事,一江春水向东流--转任总文章
  18. Reno5、Reno5 Pro和Reno5 Pro+ 的区别
  19. 动态规划之最长递增子序列 最长不重复子串 最长公共子序列
  20. [RK3288][Android6.0] USB OTG模式及切换

热门文章

  1. JDBC(Java语言连接数据库)
  2. 最邻近插值、双线性插值、三次卷积插值最通俗入门理论解析,论文材料
  3. Error processing line 1 of vision-1.0.0-py3.6-nspkg.pth AttributeError: ‘NoneType‘ object has no
  4. android 切换字体崩溃,androidx - 在Android 10 / Android Q上使用捆绑的ttf字体时崩溃 - 堆栈内存溢出...
  5. 嵌入式linux设计师,make在linux——《嵌入式linux设计与应用》
  6. 蓝桥杯vip答案java_Java实现 蓝桥杯VIP 算法训练 麦森数
  7. duration转为时间戳_Flink Table APIamp;SQL编程指南之时间属性(3)
  8. python输出文本内容_python 打印文件里的内容
  9. 炒菜机器人放食材的顺序_珠江新城有了首家机器人餐厅,40多台机器人提供服务...
  10. 如何在Win11上快速加密硬盘 Win11上快速加密硬盘方法步骤