POJ 1860 - Currency Exchange

题目大意:一个城市里有N种货币,编号从1~N,有M个货币交换点,每个交换点支持两种货币之间的交换,包括6个数据,第一种货币A,第二种货币B,A换成B的汇率,A换成B的佣金,B换成A的汇率,B换成A的佣金。一个人有V单位的编号为S的货币。问他是否能够通过交换点,使得自身的货币增多。交换点规则如下:A->B汇率为29.75,佣金为0.37。有100单位的A货币,则换成B有 (100 - 0.39) * 29.75 = 2963.3975单位

解题思路:用bellman ford算法,初始货币为exch[S] = V,不过是往大进行松弛操作,所以初始为0,如果进过N-1次循环还可以松弛,说明可以通过交换点使得货币增多。

ac代码:

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int N, M, S, u[105], v[105], t1, t2, flag;
double V, exch[105], w1[105], com1[105], w2[105], com2[105];
int main()
{
	while (scanf("%d%d%d%lf", &N, &M, &S, &V)!=EOF){
		memset(exch, 0, sizeof(exch));
		flag = 0;
		exch[S] = V;
		for (int i=0; i<M; i++)
			scanf("%d%d%lf%lf%lf%lf", &u[i], &v[i], &w1[i], &com1[i], &w2[i], &com2[i]);
		for (int i=1; i<N; i++)
			for (int j=0; j<M; j++){
				t1 = u[j], t2 = v[j];
				exch[t2] = max(exch[t2], (exch[t1]-com1[j])*w1[j]);							
				exch[t1] = max(exch[t1], (exch[t2]-com2[j])*w2[j]);			
			}
		for (int i=0; i<M; i++){
			t1 = u[i], t2 = v[i];
			if (exch[t2] < (exch[t1]-com1[i])*w1[i])
				flag = 1;
			if (exch[t1] < (exch[t2]-com2[i])*w2[i])
				flag = 1;
		}
		if (flag)
			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、付费专栏及课程。

余额充值