zoj 1092||poj2240(bellman_f…

来源:互联网 发布:mac office 账号密码 编辑:程序博客网 时间:2024/05/17 09:11
Arbitrage
Time Limit: 1000MSMemory Limit: 65536KTotal Submissions: 12086Accepted: 5075

Description

Arbitrage is the use of discrepancies in currencyexchange rates to transform one unit of a currency into more thanone unit of the same currency. For example, suppose that 1 USDollar buys 0.5 British pound, 1 British pound buys 10.0 Frenchfrancs, and 1 French franc buys 0.21 US dollar. Then, by convertingcurrencies, a clever trader can start with 1 US dollar and buy 0.5* 10.0 * 0.21 = 1.05 US dollars, making a profit of 5percent. 

Your job is to write a program that takes a list of currencyexchange rates as input and then determines whether arbitrage ispossible or not. 

Input

The input will contain one or more test cases. Omthe first line of each test case there is an integer n(1<=n<=30), representing the number of different currencies.The next n lines each contain the name of one currency. Within aname no spaces will appear. The next line contains one integer m,representing the length of the table to follow. The last m lineseach contain the name ci of a source currency, a real number rijwhich represents the exchange rate from ci to cj and a name cj ofthe destination currency. Exchanges which do not appear in thetable are impossible. 
Test cases are separated from each other by a blank line. Input isterminated by a value of zero (0) for n.

Output

For each test case, print one line telling whetherarbitrage is possible or not in the format "Case case: Yes"respectively "Case case: No".

Sample Input

3USDollarBritishPoundFrenchFranc3USDollar 0.5 BritishPoundBritishPound 10.0 FrenchFrancFrenchFranc 0.21 USDollar3USDollarBritishPoundFrenchFranc6USDollar 0.5 BritishPoundUSDollar 4.9 FrenchFrancBritishPound 10.0 FrenchFrancBritishPound 1.99 USDollarFrenchFranc 0.09 BritishPoundFrenchFranc 0.19 USDollar0

Sample Output

Case 1: YesCase 2: No

Source

Ulm Local 1996
具体解法参看图论算法
// I'm theTopcoder
//C
#include
#include
#include
#include
#include
#include
//C++
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespacestd;

//*************************OUTPUT*************************
#ifdefWIN32
#define INT64"%I64d"
#define UINT64"%I64u"
#else
#define INT64"%lld"
#define UINT64"%llu"
#endif

//**************************CONSTANT***********************
#define INF0x3f3f3f3f
#define eps1e-8
#define PIacos(-1.)
#define PI2asin (1.);
typedef longlong LL;
//typedef__int64 LL;   //codeforces
typedefunsigned int ui;
typedefunsigned long long ui64;
#define MPmake_pair
typedef vectorVI;
typedef pairPII;
#define pbpush_back
#define mpmake_pair

//***************************SENTENCE************************
#define CL(a,b)memset (a, b, sizeof (a))
#definesqr(a,b) sqrt ((double)(a)*(a) +(double)(b)*(b))
#definesqr3(a,b,c) sqrt((double)(a)*(a) + (double)(b)*(b) +(double)(c)*(c))

//****************************FUNCTION************************
template doubleDIS(T va, T vb) { return sqr(va.x - vb.x, va.y - vb.y);}
template inlineT INTEGER_LEN(T v) { int len = 1; while (v /= 10) ++len; returnlen; }
template inlineT square(T va, T vb) { return va * va + vb * vb;}

// aply for thememory of the stack
//#pragmacomment (linker,"/STACK:1024000000,1024000000")
//end

#define maxn50+10//顶点最大值
#define maxm1000+10//边数最大值
structexchange{
   int ci,cj;
   double cij;
}ex[maxm];//汇率关系数组
intn,m;
charname[maxn][20];//货币名称
chara[maxn],b[maxn];
doublex;//存入的汇率
doublemaxdist[maxn];//源点i到其他每个顶点(包括本身)的最长路径长度
intflag;
intkase=0;

intreadcase(){
   scanf("%d",&n);
   if(n==0)  return0;
   //读入n个货币的名称
   for(int i=0;i
      scanf("%s",name[i]);
   }
   scanf("%d",&m);
   for(int i=0;i
      //读入汇率
       intj,k;
       scanf("%s%lf %s",a,&x,b);
       for(j=0;strcmp(a,name[j]);j++);//*****
       for(k=0;strcmp(b,name[k]);k++);
      ex[i].ci=j;  ex[i].cij=x; ex[i].cj=k;//?????
//printf("ex[i].ci=%d\n",ex[i].ci);;
//printf("ex[i].cj=%d\n",ex[j].cj);
//printf("ex[i].cij=%lf\n",ex[i].cij);
   }
   return 1;
}

//bellman-ford算法:以顶点v0为源点,求它到每个顶点(包括它本事)的最大距离
voidbellman(int v0){
   flag=0;
  memset(maxdist,0,sizeof(maxdist));
   maxdist[v0]=1;
   for(int k=1;k<=n;k++){
      //从maxdist[0]递推到maxdist[i],,,maxdist[n];
       for(inti=0;i
         //判断每条边,加入它是否能使最大距离增加
         if(maxdist[ex[i].ci]*ex[i].cij>maxdist[ex[i].cj]){
            maxdist[ex[i].cj]=maxdist[ex[i].ci]*ex[i].cij;
          }
      }
   }
   if(maxdist[v0]>1.0) flag=1;
}
intmain(){
   while(readcase()){
       for(inti=0;i
         bellman(i);
          if(flag)  break;
      }
      if(flag)
          printf("Case %d:Yes\n",++kase);
          //printf("Case %d:YES\n",++kase);
       else//printf("Case %d: No\n",++kase);
          printf("Case %d:No\n",++kase);
   }
   return 0;
}


原创粉丝点击