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

套利是利用货币汇率的差异将一种货币的一个单位转换为同一货币的多个单位。例如,假设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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 金庸群侠传_《金庸群侠传》MOD发展史(官方版本 转自铁血丹心论坛)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼三、MOD初期在事件修改器和场景编辑器被制作出来之后&#xff0c;修改档的制作被引向了新的方向。(此后包括事件修改的“修改档”即可称之为“MOD”&#xff0c;但由于修改的量比较小&#xff0c;故以“初期”命名)这一时期的第一个…

(模拟+floyd)Saving James Bond

题目&#xff1a; This time let us consider the situation in the movie “Live and Let Die” in which James Bond, the world’s most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake filled with…

python从数据库取数据 显示字段名_如何在python中将SQL数据库中的字段名放入列表中...

以下是我目前掌握的代码&#xff1a;from ConfigParser import *import MySQLdbconfiguration ConfigParser()configuration.read(someconfigfile.conf)db MySQLdb.connect(host configuration.get(DATABASE, MYSQL_HOST),user configuration.get(DATABASE, MYSQL_USER),pa…

详解最短路算法模板(dijkstra+floyd+spfa)

1.Floyd_Warshall算法 核心思路&#xff1a;d[i][j] min{d[i][j], d[i][k] d[k][j]} 从i到j有两种路径&#xff0c;经过k点或是不经过k点&#xff0c;所以我们枚举k即可求所有路的最短路。 适用范围&#xff1a;求任意两点间的最短路&#xff0c;可以有负权&#xff0c;可以…

tomcat java垃圾回收_tomcat启动参数配置,内存和垃圾回收

一般情况下&#xff1a;JAVA_OPTS-Xms2048m -Xmx2048m -XX:MaxPermSize512m -XX:UseParallelGC -XX:ParallelGCThreads8 -XX:UseParallelOldGC -Xloggc:../logs/jvm-gc.log -XX:PrintGCDetails -XX:PrintGCTimeStamps适合于实时要求比较高&#xff1a;-Xms2048m -Xmx2048m -Xmn…

(dijkstra算法+多权值)最短路径问题

给你n个点&#xff0c;m条无向边&#xff0c;每条边都有长度d和花费p&#xff0c;给你起点s终点t&#xff0c;要求输出起点到终点的最短距离及其花费&#xff0c;如果最短距离有多条路线&#xff0c;则输出花费最少的。 Input 输入n,m&#xff0c;点的编号是1~n,然后是m行&am…

java 重定向关键字_SpringMVC 转发、重定向

转发、重定向到其它业务方法org.springframework.stereotype.ControllerRequestMapping("/userController")public classUserController{RequestMapping("/handler1")public String handler1() throwsIOException {//转发给handler2处理return "forwa…

(多源转化成单源dijsktra)一个人的旅行

虽然草儿是个路痴&#xff08;就是在杭电待了一年多&#xff0c;居然还会在校园里迷路的人&#xff0c;汗~),但是草儿仍然很喜欢旅行&#xff0c;因为在旅途中 会遇见很多人&#xff08;白马王子&#xff0c;^0^&#xff09;&#xff0c;很多事&#xff0c;还能丰富自己的阅历&…

最短路模板题

题目&#xff1a; 在每年的校赛里&#xff0c;所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候&#xff0c;却是非常累的&#xff01;所以现在他们想要寻找最短的从商店到赛场的路线&#xff0c;你可以帮助他们吗…

php 取经纬度,php根据地址获取百度地图经纬度的实例方法

首先我们来看全部实例代码&#xff1a;/*** param string $address 地址* param string $city 城市名* return array*/function getLatLng($address‘‘,$city‘‘){$result array();$ak ‘‘;//您的百度地图ak&#xff0c;可以去百度开发者中心去免费申请$url "http://…

(kruskal算法复习+模板)Eddy's picture

题目&#xff1a; Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result it can be…

php解密 eval( base64_decode,PHP之eval(gzinflate(base64_decode加密解密

从网上下载了个php版本的小游戏站的源码&#xff0c;一直都没有时间看&#xff0c;今天闲着没事看了下各个文件夹的内容&#xff0c;有一个文件引起了小胡的注意&#xff0c;文件名为php.php&#xff0c;打开之后发现了是加密过后的php文件&#xff0c;于是试着找了下相关的解密…

(kruskal)Jungle Roads

题目 The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to mainta…

php 留言板分页显示,php有分页的留言板,留言成功后怎么返回当前页?

比如我在【index.php?p3】发布留言&#xff0c;成功后怎么返回到 index.php?p3 这个页面&#xff1f;在【index.php?p5】发布留言成功后怎么返回index.php?p5这个页面&#xff1f;location.href"这里该怎么写&#xff1f;"涉及的页面有index.php&#xff0c;doac…

(最短路)HDU Today(hdu2112)

题目 Problem Description 经过锦囊相助&#xff0c;海东集团终于度过了危机&#xff0c;从此&#xff0c;HDU的发展就一直顺风顺水&#xff0c;到了2050年&#xff0c;集团已经相当规模了&#xff0c;据说进入了钱江肉丝经济开发区500强。这时候&#xff0c;XHD夫妇也退居了…

php文件读取文件内容,PHP文件系统函数-读取文件内容几种方式

介绍几种php获取文件内容的方式介绍读取文件的方式之前&#xff0c;我们先看一下打开文件资源和关闭资源名字资源绑定到一个流 - fopen关闭一个已打开的文件指针 - fclose$handle1 fopen("/home/rasmus/file.txt", "r");fclose($hanle1);$handle2 fopen(…

欧几里得算法和扩展欧几里得算法详解

欧几里得算法&#xff1a; int gcd(int x,int y){if(y) return gcd(y,x%y);return x; }扩展欧几里得算法&#xff1a; 先说一个整体思路&#xff1a; 先求AxBygcd(A,B);的一个解x&#xff0c;y 然后我们可以求他的通解 然后求AxByC的通解 我们先看看怎么求AxBygcd(A,B);的一…

php class使用方法,PHP调试类Krumo使用教程

写程序最讨厌的是程序发生错误&#xff0c;但是却又不知道该从何debug起&#xff0c;我们通常会使用print_r 或者 var_dump 或者是 echo 慢慢的debug。如果你跟我一样使用PHP 5开发&#xff0c;现在可以使用Krumo这个简单好用的工具帮助我们做这件事情。虽然IDE也有内建的debug…

(扩展欧几里得)青蛙的约会

题意 两只青蛙在网上相识了&#xff0c;它们聊得很开心&#xff0c;于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上&#xff0c;于是它们约定各自朝西跳&#xff0c;直到碰面为止。可是它们出发之前忘记了一件很重要的事情&#xff0c;既没有问清楚对方的特…

(待定系数法)A/B

题目&#xff1a; 要求(A/B)%9973&#xff0c;但由于A很大&#xff0c;我们只给出n(nA%9973)(我们给定的A必能被B整除&#xff0c;且gcd(B,9973) 1)。 Input 数据的第一行是一个T&#xff0c;表示有T组数据。 每组数据有两个数n(0 < n < 9973)和B(1 < B < 10^…