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;
}