POJ1860 Currency Exchange【最短路-判断环】
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
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
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
题意:
就是不同的货币换来换去 有汇率和手续费 问能不能换来换去换来换去把自己的钱变多
思路:
某些节点可以不停地重复 因为是增值的 增值到一定程度以后再往回肯定是可行的
刚开始不知道要怎么存图 最后用的结构体 设了边
然后不知道怎么判断到达某样的条件就可以成功
看了题解 只用判断存在环就可以了
如果回到原来的货币已经比开始的大了就可以直接退出了
改变一下松弛条件
double t = (d[point[j].beg] - point[j].c) * point[j].r;
if(d[point[j].ed] < t){
d[point[j].ed] = t;
return true;
}
return false;
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#include<cstring>
#include<queue>
#include<stack>
#define inf 0x3f3f3f3f
using namespace std;
int n, m, s, point_num;
double v;
struct edge{
int beg, ed;
double r, c;
}point[210];
double d[205];
void addpoint(int beg, int ed, double r, double c)
{
point[point_num].beg = beg;
point[point_num].ed = ed;
point[point_num].r = r;
point[point_num].c = c;
point_num++;
}
bool relax(int j)
{
double t = (d[point[j].beg] - point[j].c) * point[j].r;
if(d[point[j].ed] < t){
d[point[j].ed] = t;
return true;
}
return false;
}
bool bellman_ford()
{
for(int i = 1; i <= n; i++){
d[i] = 0.0;
}
d[s] = v;
for(int i = 0; i < n - 1; i++){
bool flag = false;
for(int j = 0; j < point_num; j++){
if(relax(j)) flag = true;
}
if(d[s] > v) return true;
if(!flag) return false;
}
for(int i = 0; i < point_num; i++){
if(relax(i)) return true;
}
return false;
}
int main()
{
while(cin>>n>>m>>s>>v){
point_num = 0;
for(int i = 0; i < m; i++){
int a, b;
double ra, ca, rb, cb;
cin>>a>>b>>ra>>ca>>rb>>cb;
addpoint(a, b, ra, ca);
addpoint(b, a, rb, cb);
}
if(bellman_ford()){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
return 0;
}
POJ1860 Currency Exchange【最短路-判断环】的更多相关文章
- POJ1860 Currency Exchange(最短路)
题目链接. 分析: 以前没做出来,今天看了一遍题竟然直接A了.出乎意料. 大意是这样,给定不同的金币的编号,以及他们之间的汇率.手续费,求有没有可能通过不断转换而盈利. 直接用Bellman-ford ...
- POJ1860——Currency Exchange(BellmanFord算法求最短路)
Currency Exchange DescriptionSeveral currency exchange points are working in our city. Let us suppos ...
- POJ 1860 Currency Exchange (bellman-ford判负环)
Currency Exchange 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/E Description Several c ...
- POJ 1860 Currency Exchange【SPFA判环】
Several currency exchange points are working in our city. Let us suppose that each point specializes ...
- POJ 1860 Currency Exchange 最短路+负环
原题链接:http://poj.org/problem?id=1860 Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Tota ...
- POJ-1860 Currency Exchange( Bellman_Ford, 正环 )
题目链接:http://poj.org/problem?id=1860 Description Several currency exchange points are working in our ...
- POJ1860 Currency Exchange(bellman-ford)
链接:http://poj.org/problem?id=1860 Currency Exchange Description Several currency exchange points are ...
- POJ 1860 Currency Exchange (最短路)
Currency Exchange Time Limit:1000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u S ...
- (简单) POJ 1860 Currency Exchange,SPFA判圈。
Description Several currency exchange points are working in our city. Let us suppose that each point ...
随机推荐
- 配置ORACLE 11g绿色版客户端和PLSQL远程连接环境
配置ORACLE 11g绿色版客户端和PLSQL环境 本方法是通过使用ORACLE官方提供的精简版客户端,即绿色免安装的客户端. Instant client的版本很多:主要是Basic和Ba ...
- IOS端的摇一摇功能
//微信的摇一摇是怎么实现的~发现原来 ios本身就支持 //在 UIResponder中存在这么一套方法 - (void)motionBegan:(UIEventSubtype)motion wit ...
- .NET Framework 4.0源代码
原文出处:http://blogs.microsoft.co.il/blogs/arik/archive/2010/07/12/step-into-net-framework-4-0-source-c ...
- Git Step by Step – (1) Git 简介
由于工作的需要,代码版本控制工具要从Perforce换成Git.说实话,刚开始真的很不适应,要从一个可以很好的支持用户界面的工具转到一个命令行工具,而且Git中有几百个命令,一下子就傻眼了. 但是经过 ...
- grid网格的流动grid-auto-flow属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- mysql临时表产生的执行效率问题改进(转)
问题: 近日,线上MySQL查出一个慢sql,每次都要查询1000ms以上,严重影响用户体验 今得空去诊断一番,记录如下: sql原句: SELECT r.object_id AS cardId, c ...
- 不作死就不会死,微软强行插入NO-IP
微软啊微软,你这是何苦来着. 事情经过大致是这样的,微软向美国法院提出起诉No-IP名下22个常用的子域名被恶意软件的作者滥用,要求法官裁定由微软接管No-IP名下的这22个子域名,以便其可以过滤恶意 ...
- Ubuntu下安装MySQL及简单操作
Ubuntu上安装MySQL非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client ...
- tts文本转语音服务
1. 谷歌tts http://translate.google.cn/translate_tts?ie=UTF-8&tl=zh-CN&q=谷歌 2. 百度tts http://tts ...
- spring mvc 篇
[1]spring mvc 实现多文件上传 http://blog.csdn.net/a1314517love/article/details/24183273 http://bbs.csdn.net ...