zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    串口 规格严格
    SWATCH 规格严格
    两个属性 规格严格
    ChinaUnix转载 规格严格
    Perl学习 规格严格
    3月5日工作日志88250
    使用NetBeans6开发OSGi应用(4)——Servlet与Http服务[88250原创]
    ごじゅうおん
    使用Apache Solr实现企业搜索
    3月6日工作日志88250
  • 原文地址:https://www.cnblogs.com/lienus/p/4273422.html
Copyright © 2011-2022 走看看