poj 1860 Currency Exchange (Bellman_ford 算法)
2014-03-06 20:56
288 查看
题目连接:点击打开链接
翻译题目:
城市里有几个货币兑换点,让我们假设每个点是给给两种特定的货币的进行相互兑换的操作,每个兑换点都有其自己的兑换率,且A到B的兑换率等同于B到A的兑换率。同样每个兑换点也需要一些操作费。
例如,如果你想兑换100us dollar到俄罗斯卢比,交换律就是29.75,小费就是0.39,所以最终你得到的卢比就是 (100 - 0.39) * 29.75 = 2963.3975RUR
现在在这个城市里有N种不同的货币可以供你兑换,现在假设每种货币的编号就是从1到N,然后对于每个兑换点用6个整数描述:A和B表示需要兑换的两种货币的编号,RAB, CAB, RBA and CBA表示兑换率和“小费”的多少
Nick有一些S货币,他想在进行一些钱币兑换后,增加他的资本,最后还得是兑换成最开始S货币。
输入:
(货币的种类)(兑换点的多少)(Nick持有的是何种货币)(该货币他持有多少)
接下来是每个兑换点的六个描述
输出:
若资本增加,YES; 资本减少,NO。
这道题利用的就是Bellman_ford算法的变形,说是变形其实也是根据题意稍稍做了下变动而已,利用Bellman_ford的思想求了一个最大路径,最后在判断是否存在正权回路,一下是AC代码,因为这几天一直在脸bellman的题目,代码
4000
大体敲出来都一样,随手一个 int dis[MAX] 就导致题目W了不知多少次。
代码如下:
翻译题目:
城市里有几个货币兑换点,让我们假设每个点是给给两种特定的货币的进行相互兑换的操作,每个兑换点都有其自己的兑换率,且A到B的兑换率等同于B到A的兑换率。同样每个兑换点也需要一些操作费。
例如,如果你想兑换100us dollar到俄罗斯卢比,交换律就是29.75,小费就是0.39,所以最终你得到的卢比就是 (100 - 0.39) * 29.75 = 2963.3975RUR
现在在这个城市里有N种不同的货币可以供你兑换,现在假设每种货币的编号就是从1到N,然后对于每个兑换点用6个整数描述:A和B表示需要兑换的两种货币的编号,RAB, CAB, RBA and CBA表示兑换率和“小费”的多少
Nick有一些S货币,他想在进行一些钱币兑换后,增加他的资本,最后还得是兑换成最开始S货币。
输入:
(货币的种类)(兑换点的多少)(Nick持有的是何种货币)(该货币他持有多少)
接下来是每个兑换点的六个描述
输出:
若资本增加,YES; 资本减少,NO。
这道题利用的就是Bellman_ford算法的变形,说是变形其实也是根据题意稍稍做了下变动而已,利用Bellman_ford的思想求了一个最大路径,最后在判断是否存在正权回路,一下是AC代码,因为这几天一直在脸bellman的题目,代码
4000
大体敲出来都一样,随手一个 int dis[MAX] 就导致题目W了不知多少次。
代码如下:
#include <iostream> #include <string.h> using namespace std; struct Edge { int a, b; double c, r; }; Edge edge[500]; int N, M, S; double V; double dis[500]; int Bellman_ford() { int i, j; for(i=1; i<=N; i++) dis[i] = 0; dis[S] = V; for(i=1; i<N; i++) for(j=1; j<=2*M; j++) { if((dis[edge[j].a] - edge[j].c) * edge[j].r > dis[edge[j].b] && dis[edge[j].a] > 0) { dis[edge[j].b] = (dis[edge[j].a] - edge[j].c) * edge[j].r; } } for(j=1; j<=2*M; j++) if((dis[edge[j].a] - edge[j].c) * edge[j].r > dis[edge[j].b]) return 1; return 0; } int main() { int i; int a, b; double c, r; cin>>N>>M>>S>>V; for(i=1; i<=M; i++) { cin>>a>>b>>r>>c; edge[i].a = a; edge[i].b = b; edge[i].r = r; edge[i].c = c; cin>>r>>c; edge[i+M].a = b; edge[i+M].b = a; edge[i+M].r = r; edge[i+M].c = c; } if(Bellman_ford()) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; }
相关文章推荐
- ios UINavigationController
- 九度 1521:二叉树的镜像
- 如何修改mysql数据库中的密码
- Spring面试题
- 补充说明:关于Beaglebone black上debian无图形界面的问题及QT的窗口示例
- 数据库 元数据的 api 学习
- 黑马程序员_正则表达式
- 使用MAVEN请注意,MAVEN不支持最新版jdk1.7
- linux zip包压缩 解压
- xcode5 ipa 打包 并安装到手机上
- C#文件操作大全
- Android大图片裁剪终极解决方案
- 懒人日记
- 实习记录11
- 2014-03-06
- Symantec BE 12.5 远程安装Exchange的安装
- 黑马程序员_java 多态
- Swing
- poj1988 权值并查集
- Android 软件开发之如何使用Eclipse Debug调试程序详解(十二)