Description
Your job is to write a program that takes a list of currency exchange rates as input and then determines whether arbitrage is possible or not.
Input
Test cases are separated from each other by a blank line. Input is terminated by a value of zero (0) for n.
Output
Sample Input
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
Sample Output
Case 1: Yes Case 2: No
題意:金币之间可以转换,问转换到最后能不能盈利
题解:flod求环,看自己到自己的值能不能大于1
#include <iostream>
#include <string.h>
#include<cstdio>
using namespace std;
#define MAXC 100
#define MAXV 50
double map[MAXV][MAXV];
int n,m;
void Input(){
char s[MAXV][MAXC],a[MAXC],b[MAXC];
int i,k,j;
double c;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
if(i==j)
map[i][j]=1;
else
map[i][j]=0;
for(i=1;i<=n;i++) scanf("%s",s[i]);
scanf("%d\n",&m);
for(i=1;i<=m;i++){
scanf("%s %lf %s",a,&c,b);
for(j=1;j<=n;j++)
if(!strcmp(s[j],a)) break;
for(k=1;k<=n;k++)
if(!strcmp(s[k],b)) break;
map[j][k]=c;
}
}
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(map[i][k]*map[k][j]>map[i][j])
map[i][j]=map[i][k]*map[k][j];
}
int main(){
int cas=1,i;
while(scanf("%d",&n) && n){
Input();
floyd();
printf("Case %d: ",cas++);
for(i=1;i<=n;i++)
if(map[i][i]>1) break;
if(i>n) printf("No\n");
else printf("Yes\n");
}
return 0;
}
938



被折叠的 条评论
为什么被折叠?



