poj1860(spfa判正环)

 

题目连接:http://poj.org/problem?id=1860

题意:有多种从a到b的汇率,在你汇钱的过程中还需要支付手续费,那么你所得的钱是 money=(nowmoney-手续费)*rate,现在问你有v钱,从s开始出发交换钱能不能赚钱。

分析:如何存在正环,能无限增加钱,肯定可以赚了,因此用spfa判一下即可

#include <cstdio>

#include <cstring>

#include <string>

#include <cmath>

#include <iostream>

#include <algorithm>

#include <queue>

#include <cstdlib>

#include <stack>

#include <vector>

#include <set>

#include <map>

#define LL long long

#define mod 100000000

#define inf 0x3f3f3f3f

#define eps 1e-9

#define N 1010

#define FILL(a,b) (memset(a,b,sizeof(a)))

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define PII pair<int,int>

using namespace std;

struct edge

{

    int v,next;

    double R,C;

    edge(){}

    edge(int v,double R,double C,int next):v(v),R(R),C(C),next(next){}

}e[N<<1];

int head[N<<1],tot;

int vis[N],cnt[N];

int n,m,S;

double V,dis[N];

void init()

{

    FILL(vis,0);FILL(head,-1);

    FILL(dis,0);FILL(cnt,0);tot=0;

}

void addedge(int u,int v,double r,double c)

{

    e[tot]=edge(v,r,c,head[u]);

    head[u]=tot++;

}

int spfa()

{

    queue<int>que;

    vis[S]=1;cnt[S]=1;

    dis[S]=V;que.push(S);

    while(!que.empty())

    {

        int u=que.front();

        que.pop();vis[u]=0;

        for(int i=head[u];~i;i=e[i].next)

        {

            int v=e[i].v;

            double w=(dis[u]-e[i].C)*e[i].R;

            if(dis[v]<w)

            {

                dis[v]=w;

                if(!vis[v])

                {

                    vis[v]=1;

                    cnt[v]++;

                    if(cnt[v]>n)return 1;

                    que.push(v);

                }

            }

        }

    }

    return 0;

}

int main()

{

    while(scanf("%d%d%d%lf",&n,&m,&S,&V)>0)

    {

        init();

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

        {

            int u,v;

            double r1,c1,r2,c2;

            scanf("%d%d%lf%lf%lf%lf",&u,&v,&r1,&c1,&r2,&c2);

            addedge(u,v,r1,c1);

            addedge(v,u,r2,c2);

        }

        if(spfa())puts("YES");

        else puts("NO");

    }

}
View Code

 

你可能感兴趣的:(SPFA)