zoukankan      html  css  js  c++  java
  • 【BZOJ2424】[HAOI2010]订货 最小费用流

    【BZOJ2424】[HAOI2010]订货

    Description

    某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费。假设仓库容量为S。

    Input

    第1行:n, m, S (0<=n<=50, 0<=m<=10, 0<=S<=10000)
    第2行:U1 , U2 , ... , Ui , ... , Un (0<=Ui<=10000)
    第3行:d1 , d2 , ..., di , ... , dn (0<=di<=100)

    Output

    只有1行,一个整数,代表最低成本

    Sample Input

    3 1 1000
    2 4 8
    1 2 4

    Sample Output

    34

    题解:同学一眼看到题觉得是贪心,为什么我一眼看到题觉得是费用流?

    最后不得不承认费用流比贪心又好想,又好写~

    蒟蒻都会的建图方法

    S->第i天 费用di,流量∞
    第i天->T 费用0,流量Ui
    第i天->第i+1天 费用m,流量S

     
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <queue>
    using namespace std;
    int n,m,s,cnt,S,T,ans;
    int dis[60],head[60],to[3000],next[3000],cost[3000],flow[3000],inq[60],pe[60],pv[60];
    queue<int> q;
    int rd()
    {
        int ret=0;  char gc=getchar();
        while(gc<'0'||gc>'9') gc=getchar();
        while(gc>='0'&&gc<='9')   ret=ret*10+gc-'0',gc=getchar();
        return ret;
    }
    void add(int a,int b,int c,int d)
    {
        to[cnt]=b,cost[cnt]=d,flow[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
        to[cnt]=a,cost[cnt]=-d,flow[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
    }
    int bfs()
    {
        memset(dis,0x3f,sizeof(dis));
        q.push(S),dis[S]=0;
        int i,u;
        while(!q.empty())
        {
            u=q.front(),q.pop(),inq[u]=0;
            for(i=head[u];i!=-1;i=next[i])
            {
                if(dis[to[i]]>dis[u]+cost[i]&&flow[i])
                {
                    dis[to[i]]=dis[u]+cost[i],pe[to[i]]=i,pv[to[i]]=u;
                    if(!inq[to[i]]) inq[to[i]]=1,q.push(to[i]);
                }
            }
        }
        return dis[T]<0x3f3f3f3f;
    }
    int main()
    {
        n=rd(),m=rd(),s=rd();
        int i,mf;
        S=0,T=n+1;
        memset(head,-1,sizeof(head));
        for(i=1;i<n;i++) add(i,i+1,s,m);
        for(i=1;i<=n;i++)    add(i,T,rd(),0);
        for(i=1;i<=n;i++)    add(S,i,1<<30,rd());
        while(bfs())
        {
            mf=1<<30;
            for(i=T;i;i=pv[i])  mf=min(mf,flow[pe[i]]);
            ans+=mf*dis[T];
            for(i=T;i;i=pv[i])  flow[pe[i]]-=mf,flow[pe[i]^1]+=mf;
        }
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    ASP.NET Web API 控制器执行过程(一)
    ASP.NET Web API 控制器创建过程(二)
    ASP.NET Web API 控制器创建过程(一)
    ASP.NET Web API WebHost宿主环境中管道、路由
    ASP.NET Web API Selfhost宿主环境中管道、路由
    ASP.NET Web API 管道模型
    ASP.NET Web API 路由对象介绍
    ASP.NET Web API 开篇示例介绍
    ASP.NET MVC 视图(五)
    ASP.NET MVC 视图(四)
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/6819623.html
Copyright © 2011-2022 走看看