題目描述
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;
}