1 //bellman_ford判断负环
2 #include <vector>
3 #include <iostream>
4 #include <cstring>
5 #include <algorithm>
6 using namespace std;
7
8 const int maxn = 200 + 5;
9
10 int n,m;
11 double v;
12 struct node{
13 int u, v;
14 double r,c;
15 }p[maxn];
16
17 double dis[maxn];
18 int cnt;
19
20 bool bellman_ford(int x){
21 memset(dis, 0, sizeof(dis));
22 dis[x] = v;
23 for(int i = 1;i < n;i++){
24 bool flag = true;
25 for(int j = 0;j < cnt;j++){
26 int aa = p[j].u;
27 int bb = p[j].v;
28 double rr = p[j].r;
29 double cc = p[j].c;
30 if(dis[bb] < (dis[aa] - cc)*rr){
31 dis[bb] = (dis[aa] - cc)*rr;
32 flag = false;
33 }
34 }
35 if(flag)
36 break;
37 }
38
39 //判断出现负环
40 for(int i = 0; i< cnt;i++)
41 if( dis[p[i].v] < (dis[p[i].u]-p[i].c)*p[i].r)
42 return true;
43 return false;
44 }
45
46 int main(){
47 int s;
48 cin >> n >> m >> s >>v;
49 cnt = 0;
50 while(m--){
51 int a, b;
52 double c1,r1,c2,r2;
53 cin >> a >> b >> c1 >> r1 >> c2 >> r2;
54 p[cnt].u = a, p[cnt].v = b, p[cnt].r = c1, p[cnt++].c = r1;
55 p[cnt].u = b, p[cnt].v = a, p[cnt].r = c2, p[cnt++].c = r2;
56 }
57 if(bellman_ford(s))
58 cout << "YES" << endl;
59 else
60 cout << "NO" << endl;
61
62 return 0;
63 }