POJ 1860 Currency Exchange(最短路 Bellman-Ford)


Currency Exchange

大意:有多种货币,之间可以交换,但是需要手续费,也就是说既有汇率又有手续费。问经过交换之后能不能赚。


思路:Bellman_Ford,因为要求最长路,所以松弛条件改一下就好了。


Tips:

3              2                  1                20.0
货币的数量   兑换点的数量     主人公拥有的货币量    主人公拥有货币的价值
1 2 1.00 1.00 1.00 1.00
//货币1与货币2交换时,1与2的汇率是1.00,1换2的手续费是1.00,2与1的汇率是1.00,2换1的手续费是1.00。
2 3 1.10 1.00 1.10 1.00
//货币1与货币2交换时,1与2的汇率是1.10,1换2的手续费是1.00,2与1的汇率是1.10,2换1的手续费是1.00。


#include <stdio.h>
#include <iostream>
#include <map>
#include <stack>
#include <string.h>
#define INF 0x3f3f3f3f
using namespace std;

int n, m, s;
double v;
double dis[110];
int t;

struct node
{
    int x, y;
    double r, c;
} Map[210];

bool Bellman_Ford()
{
    memset(dis, 0, sizeof(dis));
    dis[s] = v;
    for(int i = 1; i <= n-1; i++)
    {
        bool flag = false;
        for(int j = 0; j < t; j++)
        {
            if(dis[Map[j].y] < (dis[Map[j].x]-Map[j].c)*Map[j].r)
            {
                dis[Map[j].y] = (dis[Map[j].x]-Map[j].c)*Map[j].r;
                flag = true;
            }
        }
        if(!flag)
        {
            break;
        }
    }
    for(int i = 0; i < t; i++)
    {
        if(dis[Map[i].y] < (dis[Map[i].x]-Map[i].c)*Map[i].r)
        {
            return true;
        }
    }
    return false;
}

void Solve()
{
    int a, b;
    double Rab, Rba, Cab, Cba;
    while(~scanf("%d%d%d%lf", &n, &m, &s, &v))
    {
        t = 0;
        for(int i = 0; i < m; i++)
        {
            scanf("%d%d%lf%lf%lf%lf", &a, &b, &Rab, &Cab, &Rba, &Cba);
            Map[t].x = a;
            Map[t].y = b;
            Map[t].r = Rab;
            Map[t++].c = Cab;
            Map[t].x = b;
            Map[t].y = a;
            Map[t].r = Rba;
            Map[t++].c = Cba;
        }
        if(Bellman_Ford())
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
}

int main()
{
    Solve();

    return 0;
}

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/xuechelingxiao/article/details/18544879
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞