poj 1860 bellman-ford

来源:互联网 发布:阿里云被流量攻击 编辑:程序博客网 时间:2024/06/06 16:51

题意:

     兑换货币,给你初始货币,看看你兑换完能不能比初始货币多。这真不要脸。。。有这好事我也去换了。。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;}