POJ 1860 - Currency Exchange
2016-01-31 13:04
190 查看
E - Currency Exchange
Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d
& %I64u
Submit Status Practice POJ
1860
Appoint description:
System Crawler (2016-01-25)
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 R AB, C AB, R BA and C BA - 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 3.
For each point exchange rates and commissions are real, given with at most two digits after the decimal point, 10 -2<=rate<=10 2, 0<=commission<=10 2.
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 4.
Output
If Nick can increase his wealth, output YES, in other case output NO to the output file.
Sample Input
Sample Output
Bellman_ford变形,n次更新均成功,则说明图中一定存在正环。
Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d
& %I64u
Submit Status Practice POJ
1860
Appoint description:
System Crawler (2016-01-25)
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 R AB, C AB, R BA and C BA - 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 3.
For each point exchange rates and commissions are real, given with at most two digits after the decimal point, 10 -2<=rate<=10 2, 0<=commission<=10 2.
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 4.
Output
If Nick can increase his wealth, output YES, in other case output NO to the output file.
Sample Input
3 2 1 20.0 1 2 1.00 1.00 1.00 1.00 2 3 1.10 1.00 1.10 1.00
Sample Output
YES
Bellman_ford变形,n次更新均成功,则说明图中一定存在正环。
#include <iostream> #include <cstring> #include <cstdio> #include <string> #include <algorithm> #include <vector> using namespace std; #define N 105 #define T 2005 #define INF 0x3f3f3f3f struct Edge{ int u,v; double r,c; Edge(int uu,int vv,double rr,double cc):u(uu),v(vv),r(rr),c(cc){} }; vector<Edge> edge; int n,m,s; double v; double d ; bool ford(int u){ for (int i=1;i<=n;i++) d[i]=0; d[u]=v; for (int i=1;i<n;i++){ bool flag=false; for (int j=0;j<edge.size();j++){ int u,v; double r,c; u=edge[j].u; v=edge[j].v; r=edge[j].r; c=edge[j].c; if (d[v]<(d[u]-c)*r){ d[v]=(d[u]-c)*r; flag=true; } } if (!flag) return false; } for (int j=0;j<edge.size();j++) if (d[edge[j].v]<(d[edge[j].u]-edge[j].c)*edge[j].r) return true; return false; } int main(){ while (~scanf("%d%d%d%lf",&n,&m,&s,&v)){ for (int i=0;i<m;i++){ int a,b; double r1,r2,c1,c2; scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&c1,&r2,&c2); edge.push_back(Edge(a,b,r1,c1)); edge.push_back(Edge(b,a,r2,c2)); } if (ford(s)){ printf("YES\n"); }else{ printf("NO\n"); } } return 0; }
相关文章推荐
- 触发器
- 屏幕适配 swift纯中文翻译 响应式编程 环信 第三方IM聊天的SDK
- 504 Gateway Time-out
- AngularJS去掉的URL里的#号
- USACO-Section 3.1 Score Inflation(DP)
- 表面粗糙度及加工符号
- C++基本概念——指针和引用
- 单调队列学习
- spring web.xml中的配置
- cocos studio 半角空格和全角空格
- Netty那点事(1)概述
- 超人学院Hadoop大数据技术资源分享
- Netty那点事(2)Netty中的buffer
- Java语句介绍
- 数据结构-二叉树
- 【算法-字符串】【WERTYU】
- IOS学习之提示框第三方库之MBProgressHUD
- plsql导入一个目录下全部excel
- acct(系统调用)
- 详细讲解PHP中缓存技术的应用