Bellman_Ford算法求解,只需将其改为求最长路,判断图中是否有正环存在,在执行松弛操作时如果某一次没有发生松弛操作,则只需判断d[s]与原始钱的数目的大小关系即可;如果成功的松弛完毕,则说明图中存在着正环,就可以使货币增值.
#include<stdio.h> #include<stdlib.h> #include<string.h> struct Edge{ int u,v; double rate,com; }; Edge edge[205]; double d[105]; int n,m,s; double v; bool bellman_ford(){ memset(d,0,sizeof(d)); d[s]=v; //这儿一开始写的是循环n-1次,但是结果不对;比如可能v先减小,然后不断增加,这个次数就不一定了,所以和书中的不太一样 for(;d[s]<=v;){ bool flag=false; for(int j=0;j<2*m;j++){ double tmp=(d[edge[j].u]-edge[j].com)*edge[j].rate; if(d[edge[j].v]<tmp){ d[edge[j].v]=tmp; flag=true; } } if(flag==false) return d[s]>v; } return true; } int main(){ while(scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){ int u,v,k=0; double r1,c1,r2,c2; for(int i=0;i<m;i++){ scanf("%d%d%lf%lf%lf%lf",&u,&v,&r1,&c1,&r2,&c2); edge[k].u=u;edge[k].v=v; edge[k].rate=r1;edge[k].com=c1; k++; edge[k].u=v;edge[k].v=u; edge[k].rate=r2;edge[k].com=c2; k++; } if(bellman_ford()) printf("YES\n"); else printf("NO\n"); } //system("pause"); return 0; }