题意:
兑换货币,给你初始货币,看看你兑换完能不能比初始货币多。这真不要脸。。。有这好事我也去换了。。T,T
题解:
建个点0,从点0指向初始货币。bellman负权回路反用,也就是找正权回路就行。
#include<stdio.h>
struct point
{
int u,v;
double w,r,c;
}eg[11000];
int n,m,s;
double V,dist[110];
int bellman(int v0)
{
for(int i=1;i<=m;i++)
dist[i]=0;
dist[0]=V;
for(int i=0;i<n-1;i++)
for(int j=0;j<=2*m;j++)
if((dist[eg[j].u]-eg[j].c)*eg[j].r>dist[eg[j].v])
dist[eg[j].v]=(dist[eg[j].u]-eg[j].c)*eg[j].r;
for(int i=0;i<=2*m;i++)
if((dist[eg[i].u]-eg[i].c)*eg[i].r>dist[eg[i].v])
return -1;
return 1;
}
int main()
{
while(scanf("%d%d%d%lf",&n,&m,&s,&V)!=EOF)
{
eg[0].u=0;
eg[0].v=s;
eg[0].r=1;
eg[0].c=0;
int k=1;
for(int i=0;i<m;i++)
{
int a,b;
double r1,r2,c1,c2;
scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2);
eg[k].u=a;
eg[k].v=b;
eg[k].r=r1;
eg[k].c=c1;
k++;
eg[k].u=b;
eg[k].v=a;
eg[k].r=r2;
eg[k].c=c2;
k++;
}
if(bellman(0)==-1)printf("YES\n");
else printf("NO\n");
}
return 0;
}