POJ 1860 Currency Exchange

     很久以前看见的题目没做,因为是英文不想看,今天还是做了:

题意:一个城市里有很多货币兑换点,每个兑换点可以兑换不同的货币,比如说a兑换b有一个兑换率r,还有一个手续费c,那么有价值v的a货币兑换成b货币就有(a-c)*r。现在输入n,m,s,v;表示有n种货币,m个兑换点,刚开始拥有的货币种类编号为s,价值为v。每个兑换点输入a,b,Rab,Cab,Rba,Cba,这个兑换点用a兑换b和b兑换a的兑换率和手续费。相当于无向边。

    题意懂了就相当于构图判断有没有正权环,用Bellman不过相当于求最长路。

代码:

#include<iostream>
using namespace std;
#define exp 1e-6
struct node
{
       double c,r;
       int a,b;
} e[250];
int n,k;
double dist[105];
bool Bellman_Ford(int s,double v)
{
     int i;
     bool flag;
     for( i=0; i<n; i++)
          dist[i]=0;
     dist[s]=v;
     while( dist[s]<v+exp){
            flag=false;
            for( i=0; i<k; i++){
             double temp=(dist[e[i].a]-e[i].c)*e[i].r;
                 if( dist[e[i].b]<temp){
                     dist[e[i].b]=temp;
                     flag=true;
                 }
            }
            if( !flag)
                return false;
     }
     return true;
}
int main()
{
    int n,m,s,i,a,b;
    double v;
    while( scanf("%d%d%d%lf",&n,&m,&s,&v)!=EOF){
           k=2*m;
           for( i=0; i<k; i++){
                scanf("%d%d",&a,&b);
                e[i].a=a; 
                e[i].b=b;
                scanf("%lf%lf",&e[i].r,&e[i].c);
                i++;
                e[i].a=b; 
                e[i].b=a;
                scanf("%lf%lf",&e[i].r,&e[i].c);
           }
           if( Bellman_Ford(s,v))
               printf("YES\n");
           else
               printf("NO\n");
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值