POJ1860 - Currency Exchange

来源:互联网 发布:近年来网络阅读手机 编辑:程序博客网 时间:2024/05/29 19:54

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

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

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

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


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


//Memory Time//272K47MS#include<iostream>#include<queue>using namespace std;struct edge{edge* next;int dstVex;float rat;float com;};struct vertex{floatmoney;intdeep;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;elsecout << "NO" << endl;return 0;}


0 0
原创粉丝点击