标签:
3 USDollar BritishPound FrenchFranc 3 USDollar 0.5 BritishPound BritishPound 10.0 FrenchFranc FrenchFranc 0.21 USDollar 3 USDollar BritishPound FrenchFranc 6 USDollar 0.5 BritishPound USDollar 4.9 FrenchFranc BritishPound 10.0 FrenchFranc BritishPound 1.99 USDollar FrenchFranc 0.09 BritishPound FrenchFranc 0.19 USDollar 0
Case 1: Yes Case 2: No
题意:已知n种货币,m对互相兑换的汇率,问是否能够通过货币之间的流转盈利。
解析:Floyd算法,不过是求最大路径,而且汇率之间是乘法的关系。最后只需判断是否存在大于1的环即可。
AC代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
#define INF 123456
#define MAX_V 35
#define MAX_E 1005
double d[MAX_V][MAX_V];
int n, m;
void Floyd(){
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
d[i][j] = max(d[i][j], d[i][k] * d[k][j]); //乘法,最大值max
}
int main(){
#ifdef sxk
freopen("in.txt", "r", stdin);
#endif //sxk
int t = 0;
string s, e;
double rate;
map<string, int> a;
while(scanf("%d", &n)!=EOF && n){
for(int i=1; i<=n; i++){
cin>>s;
a[s] = i; //用map将字符串映射为数字
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) d[i][j] = (i==j) ? 1 : 0; //注意初始化
scanf("%d", &m);
for(int i=1; i<=m; i++){
cin>>s>>rate>>e;
d[ a[s] ][ a[e] ] = max(d[ a[s] ][ a[e] ], rate); //更新d值
}
Floyd();
printf("Case %d: %s\n", ++t, d[1][1] > 1 ? "Yes" : "No");
a.clear();
}
return 0;
}
hdu 1217 Arbitrage (Floyd + 最大路径)
标签:
原文地址:http://blog.csdn.net/u013446688/article/details/42970055