ZOJ 1092 POJ 2240 Arbitrage Floyd

裸的Floyd做,感觉Floyd复杂度还挺高的,有O(n^3),适合顶点少的情形。

这里先是求任意两种钱的汇率的最大值,就是一单位这种钱能换多少单位那种钱的最大的换法。在算路径时用乘法不用加法,对角线上的元素为1,自己换自己当然是1,不能换的取值为0,最后对角线上的值大于1了输出yes,否则输出no.

贴代码:

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #define INF 1000000
 4 #define MAXN 32
 5 double A[MAXN][MAXN];
 6 int n;
 7 void Floyd()
 8 {
 9     int i,j,k;
10     for(k=0; k<n; k++)
11         for(i=0; i<n; i++)
12             for(j=0; j<n; j++)
13                 if(A[i][k]*A[k][j] > A[i][j])
14                     A[i][j] = A[i][k]*A[k][j];
15 }
16 int main()
17 {
18 //    freopen("in.cpp","r",stdin);
19     int ser = 0;
20     while(~scanf("%d",&n ) && n != 0)
21     {
22         int i,j,k;
23         int m;
24         char c1[50],c2[50];
25         char a[32][50];
26         double cij;
27         for(i=0; i<n; i++)
28             scanf("%s",a[i]);
29         scanf("%d",&m);
30         for(i=0; i<n; i++)
31         {
32             for(j=0; j<n; j++)
33             {
34                 if(i == j) A[i][j] = 1;
35                 else A[i][j] = 0;
36             }
37         }
38         for(i =0; i<m; i++)
39         {
40             scanf("%s",c1);
41             scanf("%lf",&cij);
42             scanf("%s",c2);
43             for(j=0; strcmp(c1,a[j]) != 0; j++);
44             for(k=0; strcmp(c2,a[k]) != 0; k++);
45             A[j][k] = cij;
46         }
47         Floyd();
48         for(i=0; i<n; i++)
49         {
50             if(A[i][i] > 1)
51                 break;
52         }
53         printf("Case %d: ",++ser);
54         if(i == n) printf("No\n");
55         else printf("Yes\n");
56     }
57     return 0;
58 }
原文地址:https://www.cnblogs.com/allh123/p/2994263.html