思路:
bellman-ford检验正回路
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct infor{
int from;
int to;
double r;
double c;
};
infor es[20008];
double dis[200],v;
int enu,n,s;
bool bellman()
{
memset(dis,0,sizeof(dis));
dis[s]=v;
for(int i=0;i<n;i++){
for(int j=0;j<enu;j++){
infor e=es[j];
if(dis[e.to]<(dis[e.from]-e.c)*e.r){
dis[e.to]=(dis[e.from]-e.c)*e.r;
if(i==n-1)return true;
}
}
}
return false;
}
int main()
{
int m,a,b;
enu=0;
double rab,cab,rba,cba;
cin>>n>>m>>s>>v;
for(int i=0;i<m;i++){
cin>>a>>b>>rab>>cab>>rba>>cba;
es[enu].from=a;
es[enu].to=b;
es[enu].r=rab;
es[enu++].c=cab;
es[enu].from=b;
es[enu].to=a;
es[enu].r=rba;
es[enu++].c=cba;
}
if(bellman())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}