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

题意:

就是不同的货币换来换去 有汇率和手续费 问能不能换来换去换来换去把自己的钱变多

思路:

某些节点可以不停地重复 因为是增值的 增值到一定程度以后再往回肯定是可行的

刚开始不知道要怎么存图  最后用的结构体 设了边

然后不知道怎么判断到达某样的条件就可以成功

看了题解 只用判断存在环就可以了

如果回到原来的货币已经比开始的大了就可以直接退出了

改变一下松弛条件

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【最短路-判断环】的更多相关文章

  1. POJ1860 Currency Exchange(最短路)

    题目链接. 分析: 以前没做出来,今天看了一遍题竟然直接A了.出乎意料. 大意是这样,给定不同的金币的编号,以及他们之间的汇率.手续费,求有没有可能通过不断转换而盈利. 直接用Bellman-ford ...

  2. POJ1860——Currency Exchange(BellmanFord算法求最短路)

    Currency Exchange DescriptionSeveral currency exchange points are working in our city. Let us suppos ...

  3. POJ 1860 Currency Exchange (bellman-ford判负环)

    Currency Exchange 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/E Description Several c ...

  4. POJ 1860 Currency Exchange【SPFA判环】

    Several currency exchange points are working in our city. Let us suppose that each point specializes ...

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

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

  6. POJ-1860 Currency Exchange( Bellman_Ford, 正环 )

    题目链接:http://poj.org/problem?id=1860 Description Several currency exchange points are working in our ...

  7. POJ1860 Currency Exchange(bellman-ford)

    链接:http://poj.org/problem?id=1860 Currency Exchange Description Several currency exchange points are ...

  8. POJ 1860 Currency Exchange (最短路)

    Currency Exchange Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u S ...

  9. (简单) POJ 1860 Currency Exchange,SPFA判圈。

    Description Several currency exchange points are working in our city. Let us suppose that each point ...

随机推荐

  1. Unity&C# Time时间相关

    1.Unity Time类 1/ Time.time 表示从游戏开发到现在的时间,会随着游戏的暂停而停止计算. 2/ Time.timeSinceLevelLoad 表示从当前Scene开始到目前为止 ...

  2. VS2017 Pro未能找到路径“……\bin\roslyn\csc.exe”的解决方案

    VS2017改用roslyn编译的,新的roslyn编译器,支持c# 6.0语法.它放到bin里面去是为了支持asp.net应用的动态编译. 它是通过nuget的包Microsoft.CodeDom. ...

  3. SpringBoot------8080端口被占用抛出异常

    异常信息: The Tomcat connector configured to listen on port failed to start. The port may already be in ...

  4. mongodb安装使用笔记

    mongodb安装使用 安装后配置环境变量 创建数据库文件夹并连接数据库,并执行mongod --dbpath c:\workname 打开新的cmd,执行mongo命令,管理数据库 show dbs ...

  5. Sharepoint文档的CAML分页及相关筛选记录

    写这篇文章的初衷是因为其他的业务系统要调用sharepoint的文档库信息,使其他的系统也可以获取sharepoint文档库的信息列表.在这个过程中尝试过用linq to sharepoint来获取文 ...

  6. 2018.8.23几日重新编译OSG+OE+Qt遇到的问题

    Qt安装多个版本的时候,注意屏蔽掉不使用的Qt,例如OE中的CMakeLists.txt中的# FIND_PACKAGE(Qt4) 使用以前编译好的libcurl.dll现在出现"无法定位序 ...

  7. Android源码中中一种常见的struct使用方法

    直接看例子: #include<iostream> #include<stdlib.h> using namespace std; struct Base{ int ba; i ...

  8. 基础知识《零》---一张图读懂JDK,JRE,JVM的区别与联系

  9. 【Laravel5.5】 laravel5 数据库配置(MySQL)

    1   进入laravel根目录.      在config目录下找到database.php文件.      显而易见这个文件是数据库相关的配置文件. 2  修改 .env 配置完database. ...

  10. STL 迭代器 iterator const

    STL迭代器很多时候可以当成指针来使用. 但是指针一般可以用const来控制访问. 那迭代器呢. #include <iostream> #include <vector> u ...