发现这题很扯淡,根据AC的结果来看,只要能找到哪怕只有一条边使其增值,那么就算能增值
用bellman-ford算法,松弛并没有发现负权回路时,符合要求
#include<stdio.h>
#include<string.h>
#define eps 1e-8
int N,M,S,edge=0;
double V,d[110];
struct
{
int u,v;
double r,c;
}el[1000];
bool bellman_ford() //bellman-ford算法的小小变形
{
memset(d,0.0,sizeof(d));
d[S]=V;
while(d[S]<=V+eps)
{
int f=0,i;
for(i=0;i<edge;i++)
{
if(d[el[i].v]<(d[el[i].u]-el[i].c)*el[i].r)
{
d[el[i].v]=(d[el[i].u]-el[i].c)*el[i].r;
f=1;
}
}
if(!f)
return d[S]>V+eps;
}
return 1;
}
int main()
{
scanf("%d%d%d%lf",&N,&M,&S,&V);
int i;
for(i=0;i<M;i++)
{
int a,b;
double rab,cab,rba,cba;
scanf("%d%d%lf%lf%lf%lf",&a,&b,&rab,&cab,&rba,&cba);
el[edge].u=a;
el[edge].v=b;
el[edge].r=rab;
el[edge++].c=cab;
el[edge].u=b;
el[edge].v=a;
el[edge].r=rba;
el[edge++].c=cba;
}
if(bellman_ford())
printf("YES\n");
else
printf("NO\n");
return 0;
}