POJ 2240 Arbitrage(Flyod)
理解错题意啊。。。。看题解知道到做法后就很简单了,自己想的算法是错误的。。。对Floyd加深一下理解。这个是有向图找最大的环,我理解的题意偏差的太多了。。。
1 #include <stdio.h> 2 #include <string.h> 3 #define N 1000000 4 char p[31][100]; 5 double map[31][31]; 6 int n; 7 int judge(char *k) 8 { 9 int i; 10 for(i = 1; i <= n; i ++) 11 { 12 if(strcmp(k,p[i]) == 0) 13 break; 14 } 15 return i; 16 } 17 int main() 18 { 19 int i,j,k,sv,ev,m,num = 0,z; 20 double w; 21 char str[100]; 22 while(scanf("%d%*c",&n)!=EOF) 23 { 24 if(n == 0) break; 25 num ++; 26 for(i = 1; i <= n; i ++) 27 scanf("%s",p[i]); 28 for(i = 1; i <= n; i ++) 29 { 30 for(j = 1; j <= n; j ++) 31 { 32 map[i][j] = 0; 33 } 34 } 35 scanf("%d",&m); 36 for(i = 1; i <= m; i ++) 37 { 38 scanf("%s",str); 39 sv = judge(str); 40 scanf("%lf",&w); 41 scanf("%s",str); 42 ev = judge(str); 43 if(map[sv][ev] < w) 44 map[sv][ev] = w; 45 } 46 for(k = 1; k <= n; k ++) 47 for(i = 1; i <= n; i ++) 48 for(j = 1; j <= n; j ++) 49 { 50 if(map[i][j] < map[i][k]*map[k][j]) 51 map[i][j] = map[i][k] * map[k][j]; 52 } 53 z = 0; 54 for(i = 1;i <= n;i ++) 55 { 56 for(j = 1;j <= n;j ++) 57 { 58 if(map[i][j] * map[j][i] > 1) 59 z = 1; 60 } 61 } 62 printf("Case %d: ",num); 63 if(z) 64 printf("Yes\n"); 65 else 66 printf("No\n"); 67 } 68 return 0; 69 }