POJ 1217 Arbitrage(floyd)
Posted yuukoui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1217 Arbitrage(floyd)相关的知识,希望对你有一定的参考价值。
题目大意
货币间有一定的汇率可以相互兑换,
给出n种货币并告诉m条各货币间的汇率,
看这些货币中能否有一种可以通过一系列的兑换而增加。 如果是可行的,那么就输出Yes,否则输出No
花Q,博客排版好难啊,就这么将就吧
理性(瞎JB)分析:
因为汇率就是从一单位的本体开始乘
一直乘到兑换成自己为止
又要让这一个单位变多 所以直接上啊
即: 能否使一单位该货币经一系列兑换后大于一单位
然后因为这道题的n很小,所以直接用floyd也没关系
30x30x30 = 27000, 小的可怜嘛 代码的话,注释已经非常详细了
# include <iostream> # include <string> # include <map> # include <cstdio> # include <cstring> using namespace std; int n, m;//n种货币,m条兑换 map<string, int> mp ;//为每种货币编号 double d[100][100];//用来储存 i -> j 的总汇率,即:将每条兑换的汇率相乘所得积 int cnt = 1; //用以计数 Case的序号 char a[35]; char from[35], to[35]; //为避免string必须用cin而有可能导致超时的情况,全部使用char数组 double val;//当前汇率,没必要全部存下来,反正都存在d[][]里面了 void floyd(){ for(int k = 0; k < n; k++) for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) if(d[i][j] < d[i][k] * d[k][j]) //如果当前 i -> j的总汇率比新的低,则替换 //汇率高意味着一个单位的货币能兑换更多 d[i][j] = d[i][k] * d[k][j]; //floyd标准算法框架,注意本题是汇率,所以相乘而不是相加 for(int i = 0; i < n; i++) //将所有货币遍历一遍 if(d[i][i] > 1.0){ //如果有货币在更新了后本身兑换本身的汇率大于 1.0,则能够套利 printf("Case %d: Yes ", cnt++); return ; } printf("Case %d: No ", cnt++); return ; } int main(){ while(~scanf("%d", &n), n){ memset(d, 0, sizeof(d)); // 处理每组样例时将d[][]初始化 for(int i = 0; i < n; i++){ scanf("%s", a); mp[a] = i; //为货币编号 } scanf("%d", &m); for(int i = 0; i < m; i++){ scanf("%s%lf%s", from, &val, to); //字符串用 s, double类型用 lf //char数组的名字是一个指针,所以不用加 & //即对char a[] : &a[0] = a d[mp[from]][mp[to]] = val; //保存各货币间的汇率 } floyd();//处理 } return 0; }
以上是关于POJ 1217 Arbitrage(floyd)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1217 Arbitrage(最短路径,Floyd算法)
HDOJ 1217 Arbitrage(拟最短路,floyd算法)