bellman判环:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
struct edge{
int from;
int to;
double r;
double c;
}es[250];
int n,m,s,E;
double v,a,b,rab,rba,cab,cba,d[250];
bool find_loop(){
memset(d,0,sizeof(d));
d[s]=v;
for(int i=0; i<n; i++){
for(int j=0; j<E; j++){
edge e = es[j];
if(d[e.to]<(d[e.from]-e.c)*e.r){
d[e.to]=(d[e.from]-e.c)*e.r;
if(i==n-1)return true;
}
}
}
return false;
}
int main(){
while(cin>>n>>m>>s>>v){
E=0;
for(int i=0; i<m; i++){
cin>>a>>b>>rab>>cab>>rba>>cba;
es[E].from=a; es[E].to=b; es[E].r=rab; es[E++].c=cab;
es[E].from=b; es[E].to=a; es[E].r=rba; es[E++].c=cba;
}
if(find_loop())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}