POJ 1860 Currency Exchange

题意:给出N种货币,M种兑换方式,现在手上有X的货币总价值为VAL。接下来有M行,每行开始两个数字表示两种可以相互兑换的货币A,B,然后是A兑换成B的比率,手续费,B兑换成A的比率,手续费。问是否可以兑换增加手中的VAL。

Bellman_ford。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=105;
double dis[N];
struct node
{
    int x,y;
    double rate,com;
    void fun(int a,int b,double c,double d){x=a;y=b;rate=c;com=d;}
}edge[N*2];
int main()
{
    int n,m,x,all=0;
    double val;
    scanf("%d%d%d%lf",&n,&m,&x,&val);
    for(int i=0;i<m;i++)
    {
        int a,b;
        double r1,r2,t1,t2;
        scanf("%d%d%lf%lf%lf%lf",&a,&b,&r1,&r2,&t1,&t2);
        edge[all++].fun(a,b,r1,r2);
        edge[all++].fun(b,a,t1,t2);
    }
    dis[x]=val;
    while(dis[x]<=val)
    {
        bool flag=0;
        for(int j=0;j<all;j++)
        {
            int x=edge[j].x,y=edge[j].y;
            double com=edge[j].com,rate=edge[j].rate;
            if(dis[y]<(dis[x]-com)*rate)
            {
                flag=1;
                dis[y]=(dis[x]-com)*rate;
            }
        }
        if(!flag) break;
    }
    if(dis[x]>val) puts("YES");
    else puts("NO");
    return 0;
}


你可能感兴趣的:(POJ 1860 Currency Exchange)