POJ1860

最初,一直在纠结后面大循环需要用2*n还是n+1次,考虑了只有某一个point具有显著盈利的exchange ratio时,最远返回到起始currency s的最坏情况。但后来看了别人的解答,才想到了,可能存在一个小的回路,exchange ratio盈利但是并不显著,那么这个需要的次数可能为正无穷,所以就要从是否有currency在某回路反复是否有增加的情况考虑。

后来WA了很多次,最后就只是把float改成double就过了。还没想通原因。。。题目中要求10-2<=rate<=102

View Code
 1 #include<iostream>
2 #define MAXn 100
3
4
5 double quantity[MAXn+1];
6 int M1[MAXn];
7 int M2[MAXn];
8 double r[MAXn][4];
9
10 bool bellmanford(int n,int m,int s,double v)
11 {
12 bool flag;
13 for(int j=0;j<2*n;j++)
14 {
15 flag=true;
16 for(int i=0;i<m;i++)
17 {
18 if((quantity[M1[i]]-r[i][1])*r[i][0]>quantity[M2[i]])
19 {
20 flag=false;
21 quantity[M2[i]]=(quantity[M1[i]]-r[i][1])*r[i][0];
22 }
23 if((quantity[M2[i]]-r[i][3])*r[i][2]>quantity[M1[i]])
24 {
25 flag=false;
26 quantity[M1[i]]=(quantity[M2[i]]-r[i][3])*r[i][2];
27 }
28 }
29 if(flag)
30 {
31 if(quantity[s]>v)
32 {
33 flag=false;
34 return flag;
35 }
36 else
37 break;
38 }
39 }
40 for(int i=0;i<m;i++)
41 {
42 if((quantity[M1[i]]-r[i][1])*r[i][0]>quantity[M2[i]])
43 {
44 flag=false;
45 quantity[M2[i]]=(quantity[M1[i]]-r[i][1])*r[i][0];
46 }
47 if((quantity[M2[i]]-r[i][3])*r[i][2]>quantity[M1[i]])
48 {
49 flag=false;
50 quantity[M1[i]]=(quantity[M2[i]]-r[i][3])*r[i][2];
51 }
52 }
53 return flag;
54 }
55
56 int main()
57 {
58 int n,m,s;
59 double v;
60 scanf("%d%d%d%lf",&n,&m,&s,&v);
61
62 for(int i=0;i<n+1;i++)
63 quantity[i]=0;
64 quantity[s]=v;
65
66 int i=0;
67 int result=1;
68 while(i!=m)
69 {
70 scanf("%d%d%lf%lf%lf%lf",&M1[i],&M2[i],&r[i][0],
71 &r[i][1],&r[i][2],&r[i][3]);
72 i++;
73 }
74
75 if(bellmanford(n,m,s,v))
76 printf("NO\n");
77 else
78 printf("YES\n");
79
80 return 0;
81 }





posted @ 2012-02-15 12:24  ITfresh  阅读(510)  评论(0编辑  收藏  举报