POJ-1860 Currency Exchange

来源:互联网 发布:冯德伦长相知乎 编辑:程序博客网 时间:2024/06/07 03:11

题目链接:https://vjudge.net/problem/POJ-1860

用Bellman-ford算法来做,本来Bellman-ford可以用来求负权回路,这里反向利用

求正权回路,稍微改动几个地方就可以了

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int N=100+10;struct edge{int a,b;double r,c;edge(){}edge(int aa,int bb,double rr,double cc){a=aa;b=bb;r=rr;c=cc;}}e[2*N];int n,m,s;double v;double d[N];bool BF(){for(int i=1;i<=n;i++) d[i]=0; //初始化由正无穷改为 0 d[s]=v;int l=2*m;for(int i=1;i<n;i++){bool flag=false;for(int j=0;j<l;j++)if(d[e[j].b]<(d[e[j].a]-e[j].c)*e[j].r) //更新为更大值 {d[e[j].b]=(d[e[j].a]-e[j].c)*e[j].r;flag=true;}if(!flag) return false; }for(int j=0;j<l;j++)if(d[e[j].b]<(d[e[j].a]-e[j].c)*e[j].r) //存在正权回路return true;return false;}int main(){scanf("%d%d%d%lf",&n,&m,&s,&v);int a,b;double r,c;for(int i=0;i<m;i++){scanf("%d%d%lf%lf",&a,&b,&r,&c);e[i]=edge(a,b,r,c);scanf("%lf%lf",&r,&c);e[m+i]=edge(b,a,r,c);}if(BF()) printf("YES\n");else printf("NO\n");return 0;}