钱币兑换问题,问能否借助兑换货币获取利益,要考虑汇类和手续费。
第一行输入货币种类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;
}