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;    
}
posted @ 2012-04-10 22:25  zhongya  阅读(156)  评论(0编辑  收藏  举报