ZOJ 1092 图论中的Floyd算法简单应用
题目大意:给你几种货币,并给出货币之间的汇率,问你是否存在有一种货币经过兑换后,可以盈利赚钱,这就是所谓的炒外汇吧!嘿嘿!
View Code
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> int main() { int i, j, k, ncases, n, ans=1, flag; char name[30][300]; char from[31], to[31]; double rate, cur[31][31]; while(scanf("%d",&n) && n) { memset(cur,0,sizeof(cur)); for(i=0; i<n; i++) { scanf("%s",name[i]); } scanf("%d",&ncases); for(i=0; i<ncases; i++) { scanf("%s%lf%s",from,&rate,to); for(j=0; j<30; j++)//下面是吧字符串转换为数字,作为下标 { if(strcmp(from,name[j]) == 0) break; } for(k=0; k<30; k++) { if(strcmp(to,name[k]) == 0) break; } cur[j][k] = log(rate); //log的好处是在下面Floyd算法中用加法就间接实现了汇率间的乘法运算。 } for(k=0; k<n; k++)//用Floyd算法求的最大汇率 for(i=0; i<n; i++) for(j=0; j<n; j++) { if(cur[i][j] < cur[i][k] + cur[k][j]) cur[i][j] = cur[i][k] + cur[k][j]; } flag = 0; for(i=0; i<n; i++)//判断可能性,只要有可能就行了 { if(cur[i][i]> 0.0000001) flag = 1; } printf("Case %d: ",ans++); if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }