poj 2240 Arbitrage

poj 2240 Arbitrage

过的诡异。。。。。

貌似听aowarmen 讲是要判断正环,但是。。。我加了一个点,用最长路做的。。。汗。。。。

而且重边判断的不行, re 了n次。。。。。

水过。。。。。

http://acm.pku.edu.cn/JudgeOnline/problem?id=2240


后来改的,仍然判不了重边。。。


 1
  #include  < stdio.h >
 2  #include  < string .h >
 3  #include  < string >
 4  #include  < map >
 5  #define  eps 1e-30
 6  #define  max 1000
 7  using   namespace  std;
 8  map < string int >  mp;
 9  map < string int >  :: iterator it;
10  int  m, n, el;
11  double  mm[max][max];
12  struct  E{
13       int  u, v;
14  };
15  E e[ 1000000 ];
16  double  bellman(){
17       int  i, j, f;
18       double  d[max];
19       for (i  =   0 ; i  <  max; i ++ )d[i]  =   - 1 ;
20      d[ 0 =   1 ;
21       for (i  =   0 ; i  <  m; i ++ ){
22          f  =   0 ;
23           for (j  =   0 ; j  <  el; j ++ ){
24               if (d[e[j].v]  <  d[e[j].u]  *  mm[e[j].u][e[j].v]  +  eps){
25                  d[e[j].v]  =  d[e[j].u]  *  mm[e[j].u][e[j].v];
26                  f  =   1 ;
27              }
28          }
29           if ( ! f) return  d[n]  >   1.0   +  eps;
30      }
31       return  d[n]  >   1.0   +  eps;
32  }
33 
34  int  main()
35  {
36       char  input[ 1000 ], u[ 1000 ], v[ 1000 ];
37       int  i, j, l, a, b, c  =   1 ;
38       double  w;
39       while (scanf( " %d " & m), m){
40          l  =  el  =   0 ;
41          printf( " Case %d:  " , c ++ );
42          memset(mm,  0 sizeof (mm));
43           for (i  =   0 ; i  <  m; i ++ ){
44              scanf( " %s " , input);
45              mp.insert(make_pair(input, l ++ ));
46          }
47          scanf( " %d " & n);
48           for (i  =   0 ; i  <  n; i ++ ){
49              scanf( " %s%lf%s " , u,  & w, v);
50              a  =  mp.find(u) -> second;
51              b  =  mp.find(v) -> second;
52              e[el].u  =  a;
53               if (b  ==   0 )b  =  n;
54               if ( ! mm[a][b]  ||  mm[a][b]  <  w  +  eps){
55                  mm[a][b]  =  w;
56                  e[el ++ ].v  =  b;
57              }
58          }
59           if (bellman())
60              printf( " Yes\n " );
61           else  printf( " No\n " );
62          mp.clear();
63      }
64       return   0 ;
65  }

你可能感兴趣的:(poj 2240 Arbitrage)