poj 1860

题意:有各种货币 然后可以通过一定方式转换成另外一种货币 规则是  (持有货币  -  转换所需要的手续费) *  利率  =  转换成的货币 

第一行数据: 几种货币          货币汇率个数(例如 1 到2   2到  3)       现在持有第几种货币         货币的价值

剩下行 : 货币A      货币 B         货币A到货币B的汇率       AB的手续费        BA的汇率      BA的手续费

如果他的资产增值那么输出YES  反之为NO

思路: 用bellman算法求环  如果是正环那么他的资产肯定增值 判断是否存在正环就可以  具体见算法

#include <iostream>

#include <cstdio>

#include <algorithm>

#include <cstring>

#define maxn 300

using namespace std;

int n,m,s;

int coun;

double v;

struct Node

{

    int a;

    int b;

    double rate;

    double commision;

} node[maxn];

double d[maxn];

bool flag;

bool bellman()

{

    memset(d,0,sizeof(d));

    d[s] = v;

    for(int i = 1; i <= n ; i ++)

    {

        flag = false;

        for(int j = 0; j < coun; j ++)

        {

            if(d[node[j].b] < (d[node[j].a] - node[j].commision) * node[j].rate)

            {

               d[node[j].b] = (d[node[j].a] - node[j].commision) * node[j].rate;

                flag = true;

            }

        }

        if( i == n)

            return flag;

        //if(!flag)

            //break;

    }

    /*for(int k = 0; k < coun; k ++)

        if(d[node[k].b] < (d[node[k].a] - node[k].commision) * node[k].rate)

            return true;

    return false;*/

}

int main()

{

    int a,b;

    double rab,cab,rba,cba;

    scanf("%d%d%d%lf",&n,&m,&s,&v);

    coun = 0;

    for(int i = 0; i < m; i ++)

    {

        scanf("%d%d%lf%lf%lf%lf",&a,&b,&rab,&cab,&rba,&cba);

        node[coun].a = a;

        node[coun].b = b;

        node[coun].rate = rab;

        node[coun++]. commision = cab;

        node[coun].a = b;

        node[coun].b = a;

        node[coun].rate = rba;

        node[coun++].commision = cba;

    }

    if(bellman())

        printf("YES\n");

    else printf("NO\n");

    return 0;

}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值