Currency Exchange (bellman)
Bellman-ford算法N次迭代就可以判断图中是否有“负环”。
#include <stdio.h> #include <string.h> int n,m,s; double d[100],v; structnode { int a,b; double rate,com; }g[200]; int bellman() { double z; int i,k,x,y; memset(d,0,sizeof(d)); d[s]=v; for (k=1;k<=n;k++) //对所有的边进行松弛 ;最多迭代n次 for (i=1;i<=2*m;i++) //取每一条边,该松弛的松弛 { x=g[i].a; y=g[i].b; z=(d[x]-g[i].com)*g[i].rate; if ( z>d[y] ) d[y]=z; //判断有无正环,有的话就可以无限增值 } for (i=1;i<=2*m;i++) //第n次松弛就可以判断有无正环,有的话就可以无限增值 { x=g[i].a; y=g[i].b; z=(d[x]-g[i].com)*g[i].rate; if ( z>d[y] ) return 1; } return 0; } int main() { int i,v1,u1; double r_ab,c_ab,r_ba,c_ba; scanf("%d%d%d%lf",&n,&m,&s,&v); for (i=1;i<=m;i++) { scanf("%d%d%lf%lf%lf%lf",&u1,&v1,&r_ab,&c_ab,&r_ba,&c_ba); g[i].a=u1; g[i].b=v1; g[i].rate=r_ab; g[i].com=c_ab; g[m+i].a=v1; g[m+i].b=u1; g[m+i].rate=r_ba; g[m+i].com=c_ba; } printf("%s\n",bellman()?"YES":"NO"); //用bellman判断是否存在正环 return 0; }