poj1860 Currency Exchange

与poj2240很像。大概题意是Nick有某种货币S,数量为V,总共有N种货币兑换(包括S),有M个交易点,每个交易点只兑换某两种货币,可能有几个交易点交易相同的货币,即两点之间可能存在几条权值不同的边。问是否有可能通过多次兑换使Nick手中的S货币增值。

对图中的所有边进行松弛,如果在一次松弛所有边的操作中,对任意一点都没有增值作用,而此时d[S](S的数量)仍然小于等于V,则说明没有可能通过兑换使S增值。

#include<iostream>
#include<stdio.h>
#include<string.h>
#define MAXD 110
using namespace std;
int N,M,S,count;
double V,d[MAXD];
struct Edge
{
    int u;
    int v;
    double r;
    double c;
}edge[MAXD];

int bellman()
{
    int i;
    double t;
    bool flag;
    while(d[S]<=V)
    {
        flag=false;
        for(i=0;i<count;i++)
        {
            t=(d[edge[i].u]-edge[i].c)*edge[i].r;
            if(d[edge[i].v]<t)
            {
                d[edge[i].v]=t;
                flag=true;
            }
        }
        if(!flag)
        return 0;
    }
    return 1;
}
int main()
{
    //freopen("test.txt","r",stdin);
    scanf("%d%d%d%lf",&N,&M,&S,&V);
    int i,j,a,b,t;
    double r_1,c_1,r_2,c_2;
    count=0;
    for(i=1;i<=M;i++)
    {
        scanf("%d%d%lf%lf%lf%lf",&a,&b,&r_1,&c_1,&r_2,&c_2);
        edge[count].u=a;
        edge[count].v=b;
        edge[count].r=r_1;
        edge[count].c=c_1;
        count++;
        edge[count].u=b;
        edge[count].v=a;
        edge[count].r=r_2;
        edge[count].c=c_2;
        count++;
    }
    for(i=1;i<=N;i++)
    d[i]=0;
    d[S]=V;
    if(bellman())
    printf("YES\n");
    else
    printf("NO\n");
    return 0;
}

 

posted @ 2013-01-01 23:43  longlongago  Views(136)  Comments(0Edit  收藏  举报