poj 1860 bellman-ford

题意:

     兑换货币,给你初始货币,看看你兑换完能不能比初始货币多。这真不要脸。。。有这好事我也去换了。。T,T

题解:

    建个点0,从点0指向初始货币。bellman负权回路反用,也就是找正权回路就行。

#include<stdio.h>
struct point
{
	int u,v;
	double w,r,c;
}eg[11000];
int n,m,s;
double V,dist[110];
int bellman(int v0)
{
	for(int i=1;i<=m;i++)
		dist[i]=0;
	dist[0]=V;
	for(int i=0;i<n-1;i++)
		for(int j=0;j<=2*m;j++)
			if((dist[eg[j].u]-eg[j].c)*eg[j].r>dist[eg[j].v])
				dist[eg[j].v]=(dist[eg[j].u]-eg[j].c)*eg[j].r;
	for(int i=0;i<=2*m;i++)
		if((dist[eg[i].u]-eg[i].c)*eg[i].r>dist[eg[i].v])
			return -1;
	return 1;
}
int main()
{
	while(scanf("%d%d%d%lf",&n,&m,&s,&V)!=EOF)
	{
		eg[0].u=0;
		eg[0].v=s;
		eg[0].r=1;
		eg[0].c=0;
		int k=1;
		for(int i=0;i<m;i++)
		{
			int a,b;
			double r1,r2,c1,c2;
			scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2);
			eg[k].u=a;
			eg[k].v=b;
			eg[k].r=r1;
			eg[k].c=c1;
			k++;
			eg[k].u=b;
			eg[k].v=a;
			eg[k].r=r2;
			eg[k].c=c2;
			k++;
		}
		if(bellman(0)==-1)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值