POJ 2240 Arbitrage(floyd)

http://poj.org/problem?id=2240

题意 : 好吧,又是一个换钱的题:套利是利用货币汇率的差异进行的货币转换,例如用1美元购买0.5英镑,1英镑可以购买10法郎,一法郎可以购买0.21美元,所以0.5*10*0.21 = 1.05,从中获利百分之五,所以需要编写一个程序,在进行完转换之后能不能获利,如果能就输出Yes,反之No;

样例解释 : 

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为结束,第一行是一个整数n代表着下面n种货币可以进行转换,再是一个整数m,下面m行代表着m次的转换

思路 :用最短路稍微一修改思路即可

 1 #include <cstdio>

 2 #include <cstring>

 3 #include<iostream>

 4 #include<stdlib.h>

 5 #include<algorithm>

 6 using namespace std;

 7 const int oo = 1<<28;

 8 const int maxn = 1001;

 9 double map[maxn][maxn];

10 int n, m,i,j,k,a,b,cnt = 0;

11 char sh[maxn][maxn];

12 char sh1[maxn],sh2[maxn];

13 void floyd()

14 {

15     for(k = 0; k < n; k++)

16     {

17         for(i = 0; i < n; i++)

18         {

19             for(j = 0; j < n; j++)

20             {

21                 if(map[i][k]*map[k][j] > map[i][j])

22                 {

23                     map[i][j] = map[i][k]*map[k][j];

24                 }

25             }

26         }

27     }

28     int flag = 0 ;

29     for(i = 0 ; i < n ; i++)

30     {

31         if(map[i][i] > 1.0)

32         {

33             flag = 1 ;

34             break;

35         }

36     }

37     if(flag)

38         printf("Case %d: Yes\n",cnt);

39     else

40         printf("Case %d: No\n",cnt);

41 }

42 

43 int main()

44 {

45     double t;

46     while(scanf("%d",&n)&&n)

47     {

48         cnt++;

49         memset(map,oo,sizeof(map));

50         for(i = 0 ; i < n ; i++)

51         {

52             scanf("%s",sh[i]);

53             map[i][i] = 1.0 ;

54         }

55         scanf("%d",&m);

56         for(i = 0 ; i <m ; i++)

57         {

58             scanf("%s %lf %s",sh1,&t,sh2);

59             for(j = 0 ; j < n ; j++)

60             {

61                 if(strcmp(sh1,sh[j]) == 0)

62                 {

63                     //a = j ;

64                     break;

65                 }

66             }

67             for(k = 0 ; k < n ; k++)

68             {

69                 if(strcmp(sh2,sh[k]) == 0)

70                 {

71                     //b = k ;

72                     break ;

73                 }

74             }

75             map[j][k] = t;

76         }

77         floyd();

78     }

79     return 0;

80 }
View Code

 

 

你可能感兴趣的:(floyd)