1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 #include <iomanip> 10 #include <climits> 11 using namespace std; 12 int n,m,s,inq[200],cnt[200]; 13 double d[200]; 14 double v; 15 struct node{ 16 int to; 17 double h,s; 18 }; 19 vector<node>e[200]; 20 void add(int x,int y,double hui,double sh) 21 { 22 node a; 23 a.to=y; 24 a.h=hui; 25 a.s=sh; 26 e[x].push_back(a); 27 } 28 int spfa() 29 { 30 d[s]=v;inq[s]=1;cnt[s]++; 31 queue<int>q; 32 q.push(s); 33 while(!q.empty()) 34 { 35 int now=q.front();q.pop();inq[now]=0; 36 for(int i=0;i<e[now].size();i++) 37 { 38 int t=e[now][i].to; 39 if(d[t]<(d[now]-e[now][i].s)*e[now][i].h) 40 { 41 d[t]=(d[now]-e[now][i].s)*e[now][i].h; 42 if(inq[t]==1) 43 continue; 44 inq[t]=1; 45 q.push(t); 46 cnt[t]++; 47 if(cnt[t]>n) 48 return 1; 49 } 50 } 51 } 52 return 0; 53 } 54 int main(int argc, char *argv[]) 55 { 56 scanf("%d%d%d%lf",&n,&m,&s,&v); 57 for(int i=0;i<=n;i++) 58 { 59 d[i]=0; 60 inq[i]=0; 61 cnt[i]=0; 62 } 63 for(int i=0;i<m;i++) 64 { 65 int a,b; 66 double c,d,e,f; 67 scanf("%d%d%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f); 68 add(a,b,c,d); 69 add(b,a,e,f); 70 } 71 if(spfa()) 72 printf("YES\n"); 73 else 74 printf("NO\n"); 75 return 0; 76 }
原文:https://www.cnblogs.com/huluxin/p/9784324.html