博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2240 Arbitrage
阅读量:5021 次
发布时间:2019-06-12

本文共 1384 字,大约阅读时间需要 4 分钟。

用map建立从货币名称到序号的映射,看做节点,汇率则看做边权,是单向路。

用floyd,只不过这里把加号变成乘号,而且是两点间的最大值。 最后求是否有这么一点,从该点出发,再回到该点,总的值大于1。

 

注意: 不能使用dijaskra,因为增值的方法不一定是优先选择权值最大的路径,有可能是一开始的汇率小,但之后就大,总的乘积大于1.

    所以要用以动态规划为基本思想的floyd来做。

 

#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;map
currency; //建立从货币名称到编号的映射double rate[1010][1010];//rate[i][j]表示i兑换j货币的汇率vector
link[40];//link[i]表示i可以与哪些货币兑换int n,m,start;double r;char str1[101],str2[101];int cases=0;int main(){ while(scanf("%d",&n)!=EOF){ if(n==0) break; cases++; bool flag=false; for(int i=0;i<=n;i++) link[i].clear(); currency.clear(); memset(rate,0,sizeof(rate)); //memset(dis,maxn,sizeof(dis)); for(int i=1;i<=n;i++){ scanf("%s",str1); currency[str1]=i; } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%s%lf%s",str1,&r,str2); int a=currency[str1]; int b=currency[str2]; rate[a][b]=r; link[a].push_back(b); } //floyd算法 for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ //尽可能使rate[i][j]大 if(rate[i][k]*rate[k][j]>rate[i][j]){ rate[i][j]=rate[i][k]*rate[k][j]; } } } } for(int i=1;i<=n;i++){ if(rate[i][i]>1){ flag=true; break; } } if(flag){ printf("Case %d: Yes\n",cases); } else{ printf("Case %d: No\n",cases); } } return 0;}

 

转载于:https://www.cnblogs.com/chenxiwenruo/p/3280489.html

你可能感兴趣的文章
easyui源码翻译1.32--Dialog(对话框窗口)
查看>>
阿里架构师,讲述基于微服务的软件架构模式
查看>>
Eclipse导入maven项目时,Pom.xml文件报错处理方法
查看>>
01、JAVA开发准备
查看>>
asp.net mvc 错误处理 - 自定义报错处理,生成错误日志
查看>>
Linux centos ssh
查看>>
R语言之避免for循环示例
查看>>
[转]jQuery 选择器和dom操作
查看>>
Jenkins+Maven+SVN快速搭建持续集成环境(转)
查看>>
bootstrap 媒体查询
查看>>
杜教筛
查看>>
《Ext JS模板与组件基本知识框架图----模板》
查看>>
txmpp
查看>>
微信开发时调用jssdk,在安卓设备中成功调用;在ios设备中返回错误消息:config fail,无其他具体错误消息,且接口权限显示获取ok,无法调用...
查看>>
【Github教程】史上最全github使用方法:github入门到精通
查看>>
抽象工厂模式(Abstract Factory)
查看>>
luogu1373 小a和uim之大逃离 (dp)
查看>>
Redis的Pub/Sub客户端实现
查看>>
SQL日常问题和技巧——持续更新
查看>>
springMVC入门(一)------springMVC基本概念与安装
查看>>