1860

1 /*
2 bellman_ford算法
3
4 松弛操作稍微做点修改,就可判断是否存在正环了。
5
6 或者执行过程中,有大于V的也可输出
7 */
8 // include file
9 #include <cstdio>
10 #include <cstdlib>
11 #include <cstring>
12 #include <cmath>
13 #include <cctype>
14 #include <ctime>
15
16 #include <iostream>
17 #include <sstream>
18 #include <fstream>
19 #include <iomanip>
20 #include <bitset>
21 #include <strstream>
22
23 #include <algorithm>
24 #include <string>
25 #include <vector>
26 #include <queue>
27 #include <set>
28 #include <list>
29 #include <functional>
30
31 using namespace std;
32
33 // typedef
34 typedef long long LL;
35 typedef unsigned long long ULL;
36
37 //
38 #define read freopen("in.txt","r",stdin)
39 #define write freopen("out.txt","w",stdout)
40 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
41 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
42
43 #define FF(i,a) for(int i=0;i<(a);i+++)
44 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
45 #define Z(a) (a<<1)
46 #define Y(a) (a>>1)
47
48 const double eps = 1e-6;
49 const double INF = 1e10;
50 const double Pi = acos(-1.0);
51
52 template<class T> inline T sqr(T a){return a*a;}
53 template<class T> inline T TMAX(T x,T y)
54 {
55 if(x>y) return x;
56 return y;
57 }
58 template<class T> inline T TMIN(T x,T y)
59 {
60 if(x<y) return x;
61 return y;
62 }
63 template<class T> inline void SWAP(T &x,T &y)
64 {
65 T t = x;
66 x = y;
67 y = t;
68 }
69 template<class T> inline T MMAX(T x,T y,T z)
70 {
71 return TMAX(TMAX(x,y),z);
72 }
73
74
75 // code begin
76 int N,M,S;
77 double V;
78
79 #define MAXN 110
80 struct node
81 {
82 double c;
83 double r;
84 int s;
85 int e;
86 }edge[MAXN*2];
87 double dst[MAXN];
88
89 bool Bellman_Ford()
90 {
91 // 构图完成
92 // 用bellman-ford判断正环的存在或者最终结果比原来的大
93
94 FORi(1,N+1,1) dst[i] = 0;
95 dst[S] = V;
96
97 //进行N-1次
98 bool f;
99 FORi(2,N+1,1)
100 {
101 // 每条边进行松弛操作
102 f = true;
103 FORj(0,2*M,1)
104 {
105 if( ( dst[ edge[j].s ] - edge[j].c )*edge[j].r>dst[ edge[j].e ] )
106 {
107 f = false;
108 dst[ edge[j].e ] = ( dst[ edge[j].s ] - edge[j].c )*edge[j].r ;
109 }
110 }
111 if(f)
112 {
113 if(dst[S]>V) return true;
114 else return false;
115 }
116 }
117
118 FORi(0,2*M,1)
119 {
120 if( (dst[edge[i].s]-edge[i].c)*edge[i].r>dst[ edge[i].e ] )
121 return true;
122 }
123 return false;
124 }
125
126 int main()
127 {
128 read;
129 write;
130 int A,B;
131 double Rab,Cab,Rba,Cba;
132 while(scanf("%d %d %d %lf",&N,&M,&S,&V)==4)
133 {
134 FORi(0,M,1)
135 {
136 scanf("%d %d %lf %lf %lf %lf",&A,&B,&Rab,&Cab,&Rba,&Cba);
137 edge[2*i+0].s = A;
138 edge[2*i+0].e = B;
139 edge[2*i+0].r = Rab;
140 edge[2*i+0].c = Cab;
141 edge[2*i+1].s = B;
142 edge[2*i+1].e = A;
143 edge[2*i+1].r = Rba;
144 edge[2*i+1].c = Cba;
145 }
146
147 if(Bellman_Ford()) printf("YES\n");
148 else printf("NO\n");
149
150 }
151 return 0;
152 }
posted @ 2011-03-03 00:01  AC2012  阅读(324)  评论(0)    收藏  举报