题意: 求是否有一种货币经过交易后可以升值 ; 例如1美元换取0.5英镑, 1英镑换取10法币, 1法币换取0.21美元 通过交易, 1美元可以升值为 0.5*10*0.21 = 1.05美元
分析: 题目要求只要有一种货币满足条件即可,所以可用Floyd算法进行处理, 得到任意两种货币间, 最大的交易收益.
Code:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
const int maxn = 50;
int n, m;
char Dtype[maxn][maxn];
double dis[maxn][maxn];
int getStrId(char c[]){
int i;
for(i=1; i<=n; i++){
if(!strcmp(Dtype[i], c)){
return i;
}
}
return 0;
}
char s[maxn*5], e[maxn*5];
double x;
string ans;
void floyd(){
int i, j, k ;
for(k=1; k<=n; k++){
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
if(dis[i][j] < dis[i][k]*dis[k][j]){
dis[i][j] = dis[i][k]*dis[k][j];
}
}
}
}
for(i=1; i<=n; i++){
if(dis[i][i] > 1.0){
ans = "Yes";
return ;
}
}
ans = "No";
return ;
}
int main(){
int cas = 0, i, j, k;
//freopen("in.txt", "r", stdin);
while(scanf("%d", &n), n){
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
dis[i][j]=1;
}
}
ans="";
for(i=1; i<=n; i++) scanf("%s", Dtype[i]);
//for(i=1; i<=n; i++) printf("%s\n", Dtype[i]);
scanf("%d", &m);
//建图
int p, q;
for(i=1; i<=m; i++){
scanf("%s", s);
p = getStrId(s);
scanf("%lf", &x);
scanf("%s", e);
q = getStrId(e);
dis[p][q] = x;
}
floyd();
printf("Case %d: ", ++cas);
cout << ans <<endl;
}
return 0;
}