题目大意:
传送门:点我传送
我的理解:
利用Floyd-Warshall算法。注意在使用时要注意DP部分,不是简单的加法而应该是乘法!之所以会是这样,原因是汇率之间都是相乘的,根据题意而来。
此外,这里还用到了map,是为了使每种货币对应着一个数字编号,是为了在处理时更加方便。
还有一点,要记得每种货币对自己的汇率都初始化为1,如果最后其值大于1,则说明可以从中获取利润。
我的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
char currency1[50],currency2[50]; //两种货币
char currency[50]; //用于暂时存放货币名称
double rate[31][31]; //存放两种货币之间的汇率
double trans;
map<string,int> maps;
int n,m;//n代表共有n种货币种类,m代表货币之间汇率的种类
void floyd(){
for(int k = 0;k<n;k++)
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++)
if(rate[i][j] < rate[i][k] * rate[k][j]) //变形的最大路径,变"+"为"*"
rate[i][j] = rate[i][k] * rate[k][j];
return;
}
void solve(){
int d = 1;
while(d){
memset(rate,0,sizeof(rate));
cin>>n;
if(!n) break;
for(int i = 0;i<n;i++){
cin>>currency;
maps[currency] = i;
rate[i][i] = 1;
}
cin>>m;
for(int i = 0;i<m;i++){
cin>>currency1>>trans>>currency2;
rate[maps[currency1]][maps[currency2]] = trans;
}
floyd();
bool flag = false;
for(int i = 0;i<n;i++){
if(rate[i][i] > 1){
flag = true;
break;
}
}
if(flag)
cout<<"Case "<<(d++)<<": Yes"<<endl;
else
cout<<"Case "<<(d++)<<": No"<<endl;
}
}
int main()
{
freopen("D:/OJ/挑战程序设计竞赛/汇率最短路.txt","r",stdin);
solve();
return 0;
}