POJ-1860-Currency Exchange

链接:https://vjudge.net/problem/POJ-1860

题意:

有N个点,支持货币兑换,从货币a->b手续费c,汇率r。

求能否换一圈使总净额增加。

思路:

bellman-ford。

找一个正权回路。

代码:

#include <iostream>
#include <memory.h>
using namespace std;
const int MAXN = 210;
double dis[MAXN];
int n,m,s;
double v;
int w = 1;
struct Node
{
    int a,b;
    double r,c;
}node[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 = 1;j<w;j++)
        {
            int a = node[j].a,b = node[j].b;
            double r = node[j].r,c = node[j].c;
            if (dis[b] < (dis[a]-c)*r)
            {
                dis[b] = (dis[a]-c)*r;
                flag = true;
            }
        }
        if (!flag)
            break;
    }
    for (int i = 1;i < w;i++)
        if (dis[node[i].b] < (dis[node[i].a] - node[i].c)*node[i].r)
            return true;
    return false;
}

int main()
{
    int a,b;
    double rab,cab,rba,cba;
    scanf("%d%d%d%lf",&n,&m,&s,&v);
    for (int i = 0;i<m;i++)
    {
        scanf("%d%d%lf%lf%lf%lf",&a,&b,&rab,&cab,&rba,&cba);
        node[w].a = a;
        node[w].b = b;
        node[w].r = rab;
        node[w++].c = cab;
        node[w].b = a;
        node[w].a = b;
        node[w].r = rba;
        node[w++].c = cba;
    }
    if (bellman_Ford())
        printf("YES\n");
    else
        printf("NO\n");

    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/YDDDD/p/10274205.html