码迷,mamicode.com
首页 > 其他好文 > 详细

1221. [HNOI2001]软件开发【费用流】

时间:2018-03-31 15:54:23      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:sample   而且   desc   +=   noi   计划   names   任务   print   

Description

某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消毒毛巾,这种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种,A种方式的消毒需要a天时间,B种方式的消毒需要b天(b>a),A种消毒方式的费用为每块毛巾fA, B种消毒方式的费用为每块毛巾fB,而买一块新毛巾的费用为f(新毛巾是已消毒的,当天可以使用);而且f>fA>fB。公司经理正在规划在这n天中,每天买多少块新毛巾、每天送多少块毛巾进行A种消毒和每天送多少块毛巾进行B种消毒。当然,公司经理希望费用最低。你的任务就是:为该软件公司计划每天买多少块毛巾、每天多少块毛巾进行A种消毒和多少毛巾进行B种消毒,使公司在这项n天的软件开发中,提供毛巾服务的总费用最低。

Input

第1行为n,a,b,f,fA,fB. 第2行为n1,n2,……,nn. (注:1≤f,fA,fB≤60,1≤n≤1000)

Output

最少费用

Sample Input

4 1 2 3 2 1
8 2 1 6

Sample Output

38

 

上个题做了一个餐巾计划的弱化版……这个题直接就是餐巾计划(近乎原题了)
只不过餐巾计划餐巾洗完了当天就能用,这个要往后延一天

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#define LL long long
#define MAXN (10000+10)
#define MAXM (2000000+10)
using namespace std;
queue<LL>q;
LL n,m,k,s=0,e=9999,Ans,Fee;
LL num_edge,head[MAXN],dis[MAXN];
LL Need[MAXN],pre[MAXN],INF;
bool used[MAXN];
struct node
{
	LL to,next,Flow,Cost;
} edge[MAXM*2];

void add(LL u,LL v,LL l,LL c)
{
	edge[++num_edge].to=v;
	edge[num_edge].next=head[u];
	edge[num_edge].Flow=l;
	edge[num_edge].Cost=c;
	head[u]=num_edge;
}

bool Spfa(LL s,LL e)
{
	memset(pre,-1,sizeof(pre));
	memset(dis,0x7f,sizeof(dis));
	q.push(s);
	dis[s]=0;
	used[s]=true;
	while (!q.empty())
	{
		LL x=q.front();
		q.pop();
		for (int i=head[x]; i!=0; i=edge[i].next)
			if (edge[i].Flow>0 && dis[x]+edge[i].Cost<dis[edge[i].to])
			{
				dis[edge[i].to]=dis[x]+edge[i].Cost;
				pre[edge[i].to]=i;
				if (!used[edge[i].to])
				{
					used[edge[i].to]=true;
					q.push(edge[i].to);
				}
			}
		used[x]=false;
	}
	return (dis[e]!=INF);
}

void MCMF(LL s,LL e)
{
	LL Ans=0,Fee=0;
	while (Spfa(s,e))
	{
		LL d=INF;
		for (int i=e; i!=s; i=edge[((pre[i]-1)^1)+1].to)
			d=min(d,edge[pre[i]].Flow);
		for (int i=e; i!=s; i=edge[((pre[i]-1)^1)+1].to)
		{
			edge[pre[i]].Flow-=d;
			edge[((pre[i]-1)^1)+1].Flow+=d;
		}
		Ans+=d;
		Fee+=d*dis[e];
	}
	printf("%lld",Fee);
}

int main()
{
	memset(&INF,0x7f,sizeof(INF));
	scanf("%lld",&n);
	LL New,FD,FC,SD,SC;
	scanf("%lld%lld%lld%lld%lld",&FD,&SD,&New,&FC,&SC);
	for (LL i=1; i<=n; ++i)
	{
		scanf("%lld",&Need[i]);
		add(s,(i-1)*2+1,Need[i],0);
		add((i-1)*2+1,s,0,0);
		add((i-1)*2+2,e,Need[i],0);
		add(e,(i-1)*2+2,0,0);
		if (i<n)
		{
			add((i-1)*2+1,i*2+1,INF,0);
			add(i*2+1,(i-1)*2+1,0,0);
		}
	}
	for (int i=1; i<=n; ++i)
	{
		add(s,(i-1)*2+2,INF,New);
		add((i-1)*2+2,s,0,-New);

		add((i-1)*2+1,(i+FD)*2+2,INF,FC);
		add((i+FD)*2+2,(i-1)*2+1,0,-FC);

		add((i-1)*2+1,(i+SD)*2+2,INF,SC);
		add((i+SD)*2+2,(i-1)*2+1,0,-SC);

	}
	MCMF(s,e);
}

 

1221. [HNOI2001]软件开发【费用流】

标签:sample   而且   desc   +=   noi   计划   names   任务   print   

原文地址:https://www.cnblogs.com/refun/p/8682334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!