题目链接:HDU 1217 Arbitrage

简单的货币转换问题,给定多种货币,以及货币之间的汇率,问能否通过货币的转换实现收益。

例如:

1 US Dollar buys 0.5 British pound, 1 British pound buys 10.0 French francs, and 1 French 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.

【解法1】

Floyd算法。

Floyd算法可以求任意两点的最短距离, 这里通过小小的变形。求最大”收益“;

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
double maze[40][40];
int main(){int cas=1;int n;while(scanf("%d",&n)!=EOF && n){char tmp[30];map<string,int>mp;for(int i=0;i<n;i++){scanf(" %s",tmp);mp[tmp] = i;}int m;scanf("%d",&m);char st[30],end[30];double rate;memset(maze,0,sizeof(maze)); //初始化为 0 maze[0][0] = 1; //起点为1;for(int i=0;i<m;i++){scanf(" %s%lf%s",st,&rate,end);maze[mp[st]][mp[end]] = rate;}for(int k=0;k<n;k++){for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(maze[i][j] < maze[i][k] * maze[k][j]){ //这里是乘法,看是否通过汇率转换实现增大本金;maze[i][j] = maze[i][k] * maze[k][j];}}}}cout<<"Case "<<cas++<<": ";if(maze[0][0] > 1){cout<<"Yes"<<endl;}else cout<<"No"<<endl;}return 0;
}

【解法2】

SPFA 判环 ,如果起点可以通过汇率转换增大。那么在SPFA的松弛操作中会无限加入队列,判断是否重复加入n次以上即可。

和我上一篇博客的解法一致。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <map>
using namespace std;
double maze[40][40];
const int maxn = 40;
double dis[maxn]; //记录各个种类money的当前值,初始化为0 ,起点为1;
bool vis[maxn]; //标记是否在队列之中
int cnt[maxn]; //判环
int n;
int SPFA(){queue<int>Q;Q.push(0); vis[0]=1; dis[0] = 1;cnt[0]++;while(!Q.empty()){int now = Q.front(); Q.pop(); vis[now] = false;for(int i=0;i<n;i++){double rate = maze[now][i];if(dis[i] < dis[now] * rate) //如果可以增大{dis[i] = dis[now] * rate;if(!vis[i]){vis[i]=1;Q.push(i);}if(++cnt[i] > n){ //如果节点加入队列超过n次return -1;}}}return 1;
}
void init(){memset(vis,0,sizeof(vis));memset(cnt,0,sizeof(cnt));memset(dis,0,sizeof(dis));
}
int main(){int cas=1;map<string,int>mp;while(scanf("%d",&n)!=EOF && n){char tmp[30];mp.clear();for(int i=0;i<n;i++){scanf(" %s",tmp);mp[tmp] = i;}int m;scanf("%d",&m);char st[30],end[30];double rate;init();maze[0][0] = 1;for(int i=0;i<m;i++){scanf(" %s%lf%s",st,&rate,end);maze[mp[st]][mp[end]] = rate;}int ret = SPFA();cout<<"Case "<<cas++<<": ";if(ret == -1)cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}

转载于:https://www.cnblogs.com/chaiwenjun000/p/5321162.html

HDU 1217 Arbitrage (Floyd + SPFA判环)相关推荐

  1. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

  2. HDU 1317 XYZZY(floyd+bellman_ford判环)

    http://acm.hdu.edu.cn/showproblem.php?pid=1317 题意: 给出一个有向图,每到达一个点,都会加上或减去一些能量,我们要做的就是判断从1出发是否能到达n.初始 ...

  3. POJ 2240 HDU 1217 Arbitrage(Floyd)

    Description 给定一些货币之间的单向汇率,问一笔钱能否经过若干次对换而增值 Input 多组用例,每组用例第一行为货币种数n,之后n行为货币类型,第n+2行为兑换规则数m,之后m行为货币之间 ...

  4. HDU - 1217 Arbitrage [最短路]

    题目大意,货币之间对兑换,如果起始有 1 美元,1美元=0.5英镑 1英镑=10法郎,1法郎=0.21 美元.经过交换 能够得到 1*0.5*10*0.21=1.05 美元,问给定货币和汇率,能够实现 ...

  5. nyoj973 天下第一(spfa判环)

    题目973 题目信息 运行结果 本题排行 讨论区 天下第一 时间限制: 1000 ms  |  内存限制: 65535 KB 难度: 3 描述 AC_Grazy一直对江湖羡慕不已,向往着大碗吃肉大碗喝 ...

  6. hdu 1625(floyd判环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1625. 思路:大牛说是floyd判环,一想确实如此,我还一直在想如果用记忆化的怎么处理环呢...orz ...

  7. 算法提高课-图论-负环-AcWing 1165. 单词环:spfa判正环、二分、01分数规划

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 如何建图? 这样建图.以样例举例.起点是前两个字母,终点是末尾两个字母,边权是字符串的长度. 我们求的是什么呢? 题目要求Σ边权Σ1 ...

  8. 算法提高课-图论-负环-AcWing 361. 观光奶牛:spfa判正环、负环、01分数规划、二分

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 题目要求ΣfiΣgi\frac{\Sigma{f_i}}{\Sigma{g_i}}Σgi​Σfi​​的最大值,这种问题称为01分数规 ...

  9. poj 2049(二分+spfa判负环)

    poj 2049(二分+spfa判负环) 给你一堆字符串,若字符串x的后两个字符和y的前两个字符相连,那么x可向y连边.问字符串环的平均最小值是多少.1 ≤ n ≤ 100000,有多组数据. 首先根 ...

最新文章

  1. Promise的实例用法
  2. Using --强制资源清理
  3. 30个极大提高开发效率的Visual Studio Code插件
  4. LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)
  5. 使用yum时,保留下载包设置
  6. 计算机专业的书普遍都这么贵,Github上的计算机电子书很多~~~
  7. SAP 电商云 Spartacus Checkout 端到端测试
  8. 跨线程取出控件的值的写法(不是跨线程赋予控件值)
  9. 分享:一款快速传输大文件、支持英文版的工具
  10. 工作186:实际案例解决vue+el-element二级联动,选项选择后不显示的问题
  11. 【转载】JS获取浏览器版本信息
  12. SQL left join 、right join 、inner join
  13. webpack的简介---webpack工作笔记001
  14. Mac terminal终端或iterm2【 ?~?】~两边出现问号、字体有背景色的问题
  15. matlab 高阶(一) —— assignin与evalin
  16. 水经注地图发布服务中间件下载安装图文教程
  17. GIS空间分析之公路选线
  18. Datawhale学习笔记【阿里云天池 金融风控-贷款违约预测】Task2 数据分析
  19. 【算法设计与分析】C++回溯法求全排列
  20. 自学测试入门—用户注册功能的测试

热门文章

  1. 【POJ - 1942 】Paths on a Grid (组合数学,求组合数的无数种方法)
  2. 【CodeForces - 633D】Fibonacci-ish (离散化,暴力枚举+STPmap,fib数列收敛性质)
  3. **【POJ - 2389】 Bull Math (高精度乘法)
  4. 机器学习笔记:Overview
  5. 0.Overview
  6. 计算机教室安全预案 博客,校园安全应急预案
  7. 撞球编程c语言,急!C语言编程题——撞球
  8. 【算法系列之十三】二叉树两叶节点的最大距离
  9. Oracle创建视图实现获取当前数据所在的页数,这里以每页2条数据分页
  10. 服务器安全证书更新失败怎么回事,手机安全证书更新失败怎么回事