题目描述
Arbitrage
有些人会利用货币的不用汇率来进行套现,比如1美元换0.5英镑,而1英镑又可以换10法郎,而1法郎又可以换0.21的美元,那么经过货币的汇率转换后,它就可以获得1.05倍原来的美元。
现在给你N中货币,m种货币的汇率,求是否可以获利。
题目思路
- 货币名称映射到i
- flyod后看对角线元素(看能不能换到更多的自己,比如美元可以换到1.05倍的美元)
- flyod模板可见我博客最短路径 flyod模板
代码
#include <iostream>
#include <stdio.h>
#include<map>
#include<string>
#include<string.h>
using namespace std;
#define max 100
float dis[max][max];
int main() {
freopen("in.txt","r",stdin);
//名称和i的映射
map<string,int> currencies;
int n,m,casenum=0;
while(1){
cin>>n;
if(n==0){
break;
}
casenum+=1;
string name;
for(int i=1;i<=n;i++){
cin>>name;
currencies[name]=i;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) dis[i][j]=1;
else dis[i][j]=0;
}
}
cin>>m;
string name1,name2;
float rate;
for(int i=1;i<=m;i++){
cin>>name1>>rate>>name2;
dis[currencies[name1]][currencies[name2]]=rate;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]<dis[i][k]*dis[k][j]){
dis[i][j]=dis[i][k]*dis[k][j];
}
}
}
}
//判断对角线
int flag=0;
for(int i=1;i<=n;i++){
if(dis[i][i]>1){
flag=1;
}
}
if(flag){
cout<<"Case "<<casenum<<": Yes"<<endl;
}else{
cout<<"Case "<<casenum<<": No"<<endl;
}
}
fclose(stdin);
return 0;
}