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

 

转载于:https://www.cnblogs.com/You-Change/p/3473848.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值