zoukankan      html  css  js  c++  java
  • POJ1860 Currency Exchange【最短路-判断环】

    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;
    }
    



  • 相关阅读:
    hdu1209(Clock)
    [NodeJS]使用Node.js写一个简单的在线聊天室
    UVa 11168 Airport , 凸包
    【数据结构与算法】(二) c 语言链表的简单操作
    Struts简单介绍
    bzoj3931【CQOI2015】网络吞吐量
    python爬虫解决百度贴吧登陆验证码问题
    TNS-01251: Cannot set trace/log directory under ADR
    Oracle 监听器日志文件过大导致监听异常
    RHEL7
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9643426.html
Copyright © 2011-2022 走看看