UVA-11613 Acme Corporation (最大费用最大流+拆点)

题目大意:有一种商品X,其每每单位存放一个月的代价I固定。并且已知其每月的最大生产量、生产每单位的的代价、最大销售量和销售单价,还已知每个月生产的X能最多能存放的时间(以月为单位)。问只考虑前m个月,最多能获得多少利润。

题目分析:增加源点s和汇点t,将每一个月视作一个节点。建立图模型如下:将每一个节点拆成两个,即将v拆成v和v1,从s向所有的v连一条弧,容量为该月最大生产量,费用为该月的单位生产代价;然后从所有的v1出发连一条弧向t,容量为该月最大销售量,费用为销售单价的相反数;最后,从v出发向所有它能存放到的月数u对应的u1连一条弧,容量为正无穷大,费用为I*(u-v)。对该模型求最小费用最大流,显然,这里对最小费用取相反数便的最大利润。

 

代码如下:

# include<iostream>
# include<cstdio>
# include<cmath>
# include<string>
# include<vector>
# include<list>
# include<set>
# include<map>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std;

# define LL long long
# define REP(i,s,n) for(int i=s;i<n;++i)
# define CL(a,b) memset(a,b,sizeof(a))
# define CLL(a,b,n) fill(a,a+n,b)

const double inf=1e30;
const int INF=1<<30;
const int N=300;

struct Edge
{
    int fr,to;
    LL cap,flow,cost;
    Edge(int _fr,int _to,LL _cap,LL _flow,LL _cost):fr(_fr),to(_to),cap(_cap),flow(_flow),cost(_cost){}
};
vector<Edge>edges;
vector<int>G[N];
int p[N],inq[N],n,I;
LL a[N],d[N];

void init()
{
    edges.clear();
    REP(i,0,n) G[i].clear();
}

void addEdge(int fr,int to,LL cap,LL cost)
{
    edges.push_back(Edge(fr,to,cap,0,cost));
    edges.push_back(Edge(to,fr,0,0,-cost));
    int m=edges.size();
    G[fr].push_back(m-2);
    G[to].push_back(m-1);
}

bool BellmanFord(int s,int t,LL &flow,LL &cost)
{
    CL(inq,0);
    CLL(d,INF,n);
    d[s]=0,inq[s]=1,p[s]=0,a[s]=INF;

    queue<int>q;
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        inq[u]=0;
        REP(i,0,G[u].size()){
            Edge &e=edges[G[u][i]];
            if(e.cap>e.flow&&d[e.to]>d[u]+e.cost){
                d[e.to]=d[u]+e.cost;
                p[e.to]=G[u][i];
                a[e.to]=min(a[u],e.cap-e.flow);
                if(!inq[e.to]){
                    q.push(e.to);
                    inq[e.to]=1;
                }
            }
        }
    }
    if(d[t]>0) return false;
    flow+=(LL)a[t];
    cost+=(LL)d[t]*(LL)a[t];
    for(int u=t;u!=s;u=edges[p[u]].fr){
        edges[p[u]].flow+=a[t];
        edges[p[u]^1].flow-=a[t];
    }
    return true;
}

LL Mincost(int s,int t)
{
    LL flow=0,cost=0;
    while(BellmanFord(s,t,flow,cost));
    return cost;
}

struct X
{
    int m,n,p,s,E;
};
X x[105];

int main()
{
    int T,m,s,t,cas=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&m,&I);
        n=2*m+2;
        s=0,t=2*m+1;
        init();
        REP(i,1,m+1) scanf("%d%d%d%d%d",&x[i].m,&x[i].n,&x[i].p,&x[i].s,&x[i].E);
        REP(i,1,m+1){
            addEdge(0,2*i-1,x[i].n,x[i].m);
            addEdge(2*i,t,x[i].s,-x[i].p);
        }
        REP(i,1,m+1) REP(j,i,min(i+x[i].E,m)+1)
            addEdge(2*i-1,2*j,INF,I*(j-i));
        printf("Case %d: %lld\n",++cas,-Mincost(s,t));
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/20143605--pcx/p/5046956.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值