1.Link:

http://poj.org/problem?id=1860

http://bailian.openjudge.cn/practice/1860

2.Content:

Currency Exchange
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 20706   Accepted: 7428

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. 

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<=103. 
For each point exchange rates and commissions are real, given with at most two digits after the decimal point, 10-2<=rate<=102, 0<=commission<=102. 
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 104. 

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

Source

Northeastern Europe 2001, Northern Subregion

3.Method:

此题重在知道使用Bellman-Ford算法

算法原理参考:

(1)算法艺术与信息学竞赛 307页

(2)http://baike.baidu.com/view/1481053.htm

思路参考了:

http://blog.csdn.net/lyy289065406/article/details/6645778

http://www.cppblog.com/MemoryGarden/archive/2008/09/04/60912.html (这个思路有问题,一开始我也是这种思路)

4.Code:

 #include <iostream>
 #include <cstring>

 using namespace std;

 struct Exchange
 {
     int a;
     int b;
     double r;
     double c;
 };

 int main()
 {
     //freopen("D://input.txt","r",stdin);

     int i,j;

     int n,m,s;
     double v;

     cin >> n >> m >> s >> v;

     Exchange *arr_ec = ];

     int a,b;
     double rab,cab,rba,cba;
     ; i < m; ++i)
     {
         cin >> a >> b >> rab >> cab >> rba >> cba;

         arr_ec[i * ].a = a - ;
         arr_ec[i * ].b = b - ;
         arr_ec[i * ].r = rab;
         arr_ec[i * ].c = cab;

         arr_ec[i *  + ].a = b - ;
         arr_ec[i *  + ].b = a - ;
         arr_ec[i *  + ].r = rba;
         arr_ec[i *  + ].c = cba;
     }

     //for(i = 0; i < m * 2; ++i) cout << arr_ec[i].a << " " << arr_ec[i].b << " " << arr_ec[i].r << " " << arr_ec[i].c << endl;

     double *d = new double[n];
     memset(d, , sizeof(double) * n);
     d[s - ] = v;

     //for(i = 0; i < n; ++i) cout << d[i] << " ";

     //Bellman-Ford
     int flag;
     ; i <= n - ; ++i)
     {
         flag = ;
         ; j <  * m; ++j)
         {
             if(d[arr_ec[j].b] < (d[arr_ec[j].a] - arr_ec[j].c) * arr_ec[j].r)
             {
                 d[arr_ec[j].b] = (d[arr_ec[j].a] - arr_ec[j].c) * arr_ec[j].r;
                 flag = ;
             }
         }
         if(!flag) break;
         //for(j = 0; j < n; ++j) cout << d[j] << " ";
         //cout << endl;
     }

     ; i <  * m; ++i)
     {
         if(d[arr_ec[i].b] < (d[arr_ec[i].a] - arr_ec[i].c) * arr_ec[i].r) break;
     }

      * m) cout << "YES" << endl;
     else cout << "NO" << endl;

     delete [] d;
     delete [] arr_ec;

     ;
 }

5.Reference:

Poj OpenJudge 百练 1860 Currency Exchang的更多相关文章

  1. Poj OpenJudge 百练 1062 昂贵的聘礼

    1.Link: http://poj.org/problem?id=1062 http://bailian.openjudge.cn/practice/1062/ 2.Content: 昂贵的聘礼 T ...

  2. Poj OpenJudge 百练 2602 Superlong sums

    1.Link: http://poj.org/problem?id=2602 http://bailian.openjudge.cn/practice/2602/ 2.Content: Superlo ...

  3. Poj OpenJudge 百练 2389 Bull Math

    1.Link: http://poj.org/problem?id=2389 http://bailian.openjudge.cn/practice/2389/ 2.Content: Bull Ma ...

  4. Poj OpenJudge 百练 1573 Robot Motion

    1.Link: http://poj.org/problem?id=1573 http://bailian.openjudge.cn/practice/1573/ 2.Content: Robot M ...

  5. Poj OpenJudge 百练 2632 Crashing Robots

    1.Link: http://poj.org/problem?id=2632 http://bailian.openjudge.cn/practice/2632/ 2.Content: Crashin ...

  6. Poj OpenJudge 百练 Bailian 1008 Maya Calendar

    1.Link: http://poj.org/problem?id=1008 http://bailian.openjudge.cn/practice/1008/ 2.content: Maya Ca ...

  7. Openjudge 百练第4109题

    在OpenJudge看到一个题目(#4109),题目描述如下: 小明和小红去参加party.会场中总共有n个人,这些人中有的是朋友关系,有的则相互不认识.朋友关系是相互的,即如果A是B的朋友,那么B也 ...

  8. [OpenJudge] 百练2754 八皇后

    八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. ...

  9. POJ 1860 Currency Exchange 最短路+负环

    原题链接:http://poj.org/problem?id=1860 Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Tota ...

随机推荐

  1. IOS App动态更新

    框架 JSPatch WaxPatch react-native   方案对比 目前已经有一些方案可以实现动态打补丁,例如WaxPatch,可以用Lua调用OC方法,相对于WaxPatch,JSPat ...

  2. POJ 3074 Sudoku (Dancing Links)

    传送门:http://poj.org/problem?id=3074 DLX 数独的9*9的模板题. 具体建模详见下面这篇论文.其中9*9的数独怎么转化到精确覆盖问题,以及相关矩阵行列的定义都在下文中 ...

  3. A+B Problem(V)

    描述 做了A+B Problem之后,Yougth感觉太简单了,于是他想让你求出两个数反转后相加的值.帮帮他吧 输入 有多组测试数据.每组包括两个数m和n,数据保证int范围,当m和n同时为0是表示输 ...

  4. Emacs 配置 Python 编程环境

    python编程环境设置涉及到:自动完成.语法检查.虚拟环境. 为了不把系统搞乱,在python的虚拟环境中安装相关的插件. 一.安装python虚拟环境 virtualenvwrapper sudo ...

  5. GCD 的使用

    // // ZYGCDViewController.h // Thread // // Created by wanglixing on 14/11/4. // Copyright © 2014年 z ...

  6. 关于直接创建视图UITableViewController显示(初学)

    今天渣渣想直接创建一个UITableView视图作为根视图来用结果发现有警告,才明白TableView和view是不能直接作为根视图的,需要放在ViewController上.做个笔记详细了解下. 参 ...

  7. 物理CPU、物理核跟逻辑核的区分

    一般来说,物理CPU个数×每颗核数就应该等于逻辑CPU的个数,如果不相等的话,则表示服务器的CPU支持超线程技术 ,所以您的电脑是双核的. 一 概念① 物理CPU 实际Server中插槽上的CPU个数 ...

  8. python方式实现scoket通信

    要想明白这个网络通信还真的是离不开实现它实现流程图,看明白了大体很多都知道,觉得这个博主画的不错,地址是 http://www.cnblogs.com/wangcq/p/3520400.html 1. ...

  9. 关于css制作圆角

    三个阶段: 1.背景图片: 2.css2.0+标签模拟圆角: 3.css3.0圆角属性(border-radius). 1.1.背景图片--宽度固定,高度自适应圆角 为容器设置宽度 在主体的上方加一个 ...

  10. sql2005导出数据字典

    右击要导出的数据库,点击 新建视图 粘贴下面代码 SELECT 表名= then d.name else '' end, 表说明= then isnull(f.value,'') else '' en ...