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

 

posted @ 2013-12-13 21:49  单调的幸福  阅读(231)  评论(0编辑  收藏  举报