Poj_1860 Currency Exchange(最短路)

本文介绍了一种通过Bellman-Ford算法检测货币兑换过程中是否存在获利正环的方法。具体包括问题背景、基本算法原理及其实现步骤,展示了如何通过松弛操作判断图中是否含有能增加财富的正环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

Nick现在有一国的货币,他想看能不能通过与其他货币交换使得自己的财富增加(存在正环)。

国与国之间的货币交换遵循下面的规则:currB=(currA-commAB)*rateAB;

思路:

最短路找环,确定使用Bellman-Ford算法,利用松弛的的次数确定图中是否存在正环。

代码实现:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX = 110;
const int INF = 1050;

struct Edge{
    int from;
    int to;
    double rate;
    double comm;
};

int cnt;
int N,S,M;
double V;
bool flag;
double curr[MAX];
Edge edge[2*MAX];
bool find_loop();
int main()
{
    while( scanf("%d",&N) != EOF ){
        scanf("%d%d",&M,&S);
        scanf("%lf",&V);
        for( int i = 1; i < N; i++ ){
            curr[i] = 0;
        }
        curr[S] = V;
        cnt = 0;
        flag = false;
        int a,b;
        double c,d,e,f;
        for( int i = 0; i < M; i++ ){
            scanf("%d%d",&a,&b);
            scanf("%lf%lf%lf%lf",&c,&d,&e,&f);
            edge[cnt].from = a;
            edge[cnt].to = b;
            edge[cnt].rate = c;
            edge[cnt].comm = d;
            cnt++;
            edge[cnt].from = b;
            edge[cnt].to = a;
            edge[cnt].rate = e;
            edge[cnt].comm = f;
            cnt++;
        }
        flag = find_loop();
        if( flag == true ){
            printf("YES\n");
        }
        else{
            printf("NO\n");
        }
    }
    return 0;
}

bool find_loop(){
    for( int i = 0; i < N; i++ ){
        for( int j = 0; j < cnt; j++ ){
            Edge e = edge[j];
            if( curr[e.to] < (curr[e.from]-e.comm)*e.rate ){
                curr[e.to] = (curr[e.from]-e.comm)*e.rate;
                if( i == N-1 ){
                    return true;
                }
            }
        }
    }
    return false;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值