Currency Exchange (Bellman-Ford算法,判断是否有正权回路)
来源:互联网 发布:尼康d810调焦软件 编辑:程序博客网 时间:2024/06/05 04:39
Currency Exchange
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 60000/30000K (Java/Other)
Total Submission(s) : 84 Accepted Submission(s) : 25
Problem Description
Several currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currencies. There can be several points specializing in the same pair of currencies. Each point has its own exchange rates, exchange rate of A to B is the quantity of B you get for 1A. Also each exchange point has some commission, the sum you have to pay for your exchange operation. Commission is always collected in source currency.
For example, if you want to exchange 100 US Dollars into Russian Rubles at the exchange point, where the exchange rate is 29.75, and the commission is 0.39 you will get (100 - 0.39) * 29.75 = 2963.3975RUR.
You surely know that there are N different currencies you can deal with in our city. Let us assign unique integer number from 1 to N to each currency. Then each exchange point can be described with 6 numbers: integer A and B - numbers of currencies it exchanges, and real RAB, CAB, RBA and CBA - exchange rates and commissions when exchanging A to B and B to A respectively.
Nick has some money in currency S and wonders if he can somehow, after some exchange operations, increase his capital. Of course, he wants to have his money in currency S in the end. Help him to answer this difficult question. Nick must always have non-negative sum of money while making his operations.
For example, if you want to exchange 100 US Dollars into Russian Rubles at the exchange point, where the exchange rate is 29.75, and the commission is 0.39 you will get (100 - 0.39) * 29.75 = 2963.3975RUR.
You surely know that there are N different currencies you can deal with in our city. Let us assign unique integer number from 1 to N to each currency. Then each exchange point can be described with 6 numbers: integer A and B - numbers of currencies it exchanges, and real RAB, CAB, RBA and CBA - exchange rates and commissions when exchanging A to B and B to A respectively.
Nick has some money in currency S and wonders if he can somehow, after some exchange operations, increase his capital. Of course, he wants to have his money in currency S in the end. Help him to answer this difficult question. Nick must always have non-negative sum of money while making his operations.
Input
The first line of the input contains four numbers: N - the number of currencies, M - the number of exchange points, S - the number of currency Nick has and V - the quantity of currency units he has. The following M lines contain 6 numbers each - the description of the corresponding exchange point - in specified above order. Numbers are separated by one or more spaces. 1<=S<=N<=100, 1<=M<=100, V is real number, 0<=V<=10<sup>3</sup>.<br>For each point exchange rates and commissions are real, given with at most two digits after the decimal point, 10<sup>-2</sup><=rate<=10<sup>2</sup>, 0<=commission<=10<sup>2</sup>.<br>Let us call some sequence of the exchange operations simple if no exchange point is used more than once in this sequence. You may assume that ratio of the numeric values of the sums at the end and at the beginning of any simple sequence of the exchange operations will be less than 10<sup>4</sup>.<br>
Output
If Nick can increase his wealth, output YES, in other case output NO to the output file.
Sample Input
3 2 1 20.01 2 1.00 1.00 1.00 1.002 3 1.10 1.00 1.10 1.00
Sample Output
YES
Source
PKU
题意:一个城市有 N 种货币, 有 M 个兑换点, 兑换货币有一定的兑换率 r 和佣金 c,如果货币 A 兑换 B 兑换率是 r ,佣金是 c那么value 个 A 可以换成 (value-c)*r 个 , 每个兑换点能两种货币双向兑换,但是兑换比例和佣金不同,输入时注意一下, 问:最后如果能够使得自己的钱变多,则输出 YES,否则输出 NO。
思路:
用Bellman-Ford算法判断是否有正权回路,注意是乘不再是加,还有就是应该用">",而不是小于号了。
代码:
#include <iostream>#include <cstring>#include <string>#include <stdio.h>#define inf 0x3f3f3f3fusing namespace std;struct currency{int a,b;double rate,cost;}p[305];int n,m,s;double v,rab,rba,cab,cba,dis[105];int main(){ int i,j,x,y; cin>>n>>m>>s>>v; for(i=1;i<=m;i++){ cin>>x>>y>>rab>>cab>>rba>>cba; //输入 p[i].a=x,p[i].b=y,p[i].rate=rab,p[i].cost=cab; p[i+m].a=y,p[i+m].b=x,p[i+m].rate=rba,p[i+m].cost=cba;//回来时的,两者是不同的,要注意。 } for(i=1;i<=n;i++) dis[i]=0; //初始化,此处与Bellman-Ford的处理相反,初始化为源点到各点距离0,到自身的值为原值 dis[s]=v; for(i=1;i<=n;i++) { for(j=1;j<=2*m;j++){ if((dis[p[j].a]-p[j].cost)*p[j].rate>dis[p[j].b]) dis[p[j].b]=(dis[p[j].a]-p[j].cost)*p[j].rate;//注意用乘号和大于号 } } bool flag=0; for(i=1;i<=2*m;i++){ if((dis[p[i].a]-p[i].cost)*p[i].rate>dis[p[i].b]) //存在正权回路。 { flag=1;break; } } if(flag)cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0;}
阅读全文
1 0
- Currency Exchange (Bellman-Ford算法,判断是否有正权回路)
- POJ 1860 Currency Exchange Bellman-Ford算法求单源最短路径并判断是否有正权回路
- Currency Exchange(Bellman-Ford)
- Currency Exchange(bellman-Ford)
- POJ1860 Currency Exchange【bellman-Ford算法】
- POJ1860(Currency Exchange)(Bellman-Ford)
- POJ 1860 Currency Exchange(Bellman-Ford)
- POJ 1860 Currency Exchange(Bellman-Ford)
- POJ1860-Currency Exchange(bellman-ford求正环)
- POJ-1860 Currency Exchange(Bellman-Ford)
- poj 1860 Currency Exchange (SPFA、正权回路 bellman-ford)
- POJ 1860 Currency Exchange(Bellman-Ford判断最长路是否含有正环)
- poj1860 Currency Exchange --- Bellman-Ford
- Currency Exchange 反向Bellman-Ford
- Poj1860 Currency Exchange Bellman-Ford
- POJ 1860 Currency Exchange (Bellman-Ford算法的运用)
- poj 1860 Currency Exchange (最短路,Bellman-Ford算法)
- URAL 1162 Currency Exchange (Bellman-Ford贝尔曼-福特算法)
- 工厂模式和抽象工厂模式
- Python入门5_条件循环语句
- luoguP3402 最长公共子序列(LCS-->LIS)
- Java面向对象之包装类
- Python创建虚拟环境
- Currency Exchange (Bellman-Ford算法,判断是否有正权回路)
- 文章标题
- JZOJ2017.08.08 C组
- Spring-data-JPA生成JPQL语句方法名称中支持的关键字
- git 提交到远程另外仓库
- linux学习常用命令
- 数据结构上机测试2-2:单链表操作B
- Caffe学习:pycaffe利用caffemodel进行分类=>批处理
- Ecology8二次开发:HTML表单隐藏行与显示行