POJ1860 - Currency Exchange

钱币兑换问题,问能否借助兑换货币获取利益,要考虑汇类和手续费。

第一行输入货币种类N,兑换点M(可以双向兑换),现有货币种类,现有货币种类。

之后M行,每行输入6个数,货币a,货币b,a到b的汇率,a到b兑换的手续费,a到b的汇率,b到a兑换的手续费,b到a的汇率。

兑换公式为: b = (a - 手续费)* 汇率。


借助bellman-ford算法判断环的思路解题。


//Memory Time
//272K	47MS

#include<iostream>
#include<queue>
using namespace std;

struct edge
{
	edge* next;
	int dstVex;
	float rat;
	float com;
};

struct vertex
{
	float	money;
	int	deep;
	bool isAddInQueue;
};

vertex vex[101];
edge* eg[101];


int main()
{
	int N, M, type;
	float money;
	cin>>N>>M>>type>>money;
	for(int i = 1; i<= N; i++)
	{
		vex[i].money = -1;
		vex[i].deep = -1;
		vex[i].isAddInQueue = false;
		eg[i] = NULL;
	}
	vex[type].money = money;
	vex[type].deep  = 1;
	
	for(int i = 0; i < M; i++)
	{
		int src, dst;
		float rat, com;
		cin >> src >> dst;
		cin >> rat >> com;
		edge* e = new edge;
		e->next = eg[src];
		e->dstVex  = dst;	e->rat = rat;	e->com = com;
		eg[src] = e;
		
		cin >> rat >> com;
		e = new edge;
		e->next = eg[dst];
		e->dstVex  = src;	e->rat = rat;	e->com = com;
		eg[dst] = e;
	}
	
	queue<int> que;
	
	vex[type].isAddInQueue = true;
	que.push(type);
	int maxDeep = 0;
	while(!que.empty())
	{
		int tempSrc = que.front();
		vex[tempSrc].isAddInQueue = false;
		que.pop();
		edge* e = eg[tempSrc];
		while(e != NULL)
		{
			int dstVex = e->dstVex;
			float tempMoney = vex[tempSrc].money;
			tempMoney = (tempMoney - e->com) * e->rat;
			if(tempMoney > vex[dstVex].money)
			{
				vex[dstVex].money = tempMoney;
				vex[dstVex].deep = vex[tempSrc].deep + 1;
				if(vex[dstVex].deep > maxDeep)
					maxDeep = vex[dstVex].deep;
				
				if(vex[dstVex].isAddInQueue == false)
				{
					que.push(dstVex);
					vex[dstVex].isAddInQueue == true;
				}
			}
			e = e->next;
		}
		if(maxDeep > N)
			break;
	}
	if(maxDeep > N)
		cout << "YES" << endl;
	else
		cout << "NO" << endl;
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值