ZOJ 1092 Arbitrage (floyd变形)

给出各种货币的汇率,你可以在各种货币之间转换,看能不能用某种交换方法,能使你最终得到的钱比刚开始得多,当然是同一种货币的时候。

 

如果平常做最短路径肯定不知道可以用floyd来做,我之前看了一个paper,上面说到,松弛过程中的

 

                 d[v] < d[u] + w(v,u)

 

这里面的加号可以延伸为各种形式的运算的,当时没注意,想到应该没有什么用,碰巧在这道题中floyd也可以变换符号。。挺神奇的,记住记住,以后可能用到。。

 

#include<stdio.h> #include<string.h> int n,i,j,k,edges; int from,to; double weight; int flag,start = 1; double biao[31][31]; char kindof[31][50]; char t[50]; int find(char *a) { int i; for( i = 1; i <= n; i++ ) if(strcmp(a,kindof[i]) == 0) return i; } int main(void) { while( scanf("%d",&n) != EOF && n) { for( i = 1; i <= 30; i++ ) for( j = 1; j <= 30 ; j++ ) biao[i][j] = 0; for( i = 1; i <= 30; i++ ) biao[i][i] = 1; for( i = 1; i <= n; i++ ) scanf("%s",kindof[i]); scanf("%d",&edges); for( i = 1; i <= edges; i++ ) { scanf("%s",t); from = find(t); scanf("%lf%s",&weight,t); to = find(t); biao[from][to] = weight; } for( k = 1; k <= n; k++ ) for( i = 1; i <= n; i++ ) for( j = 1; j <= n; j++ ) if( biao[i][j] < biao[i][k] * biao[k][j] ) biao[i][j] = biao[i][k] * biao[k][j]; printf("Case %d: ",start++); for( i = 1, flag = 0; i <= n; i++ ) if( biao[i][i] > 1.0 ) {flag = 1;printf("Yes/n");break;} if( !flag ) printf("No/n"); } return 0; }

你可能感兴趣的:(ZOJ 1092 Arbitrage (floyd变形))