博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

bzoj:1221;vijos 1552 软件开发

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
 
不会上下线网络流的我只能拆点……
拆点部分贴出来咯

for (i=1;i<=n;i++) v=read(),in(S,i,v,0),in(i+n,T,v,0),in(S,i+n,INF,f);
for (i=1;i<n-a;i++) in(i,i+n+a+1,INF,fa);
for (i=1;i<n-d;i++) in(i,i+n+d+1,INF,fb);//这里的d其实是原题的b
for (i=1;i<n;i++) in(i,i+1,INF,0);

 

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 2100
#define MAXM 12000
using namespace std;

struct na{
    int y,z,f,ne;
};
int n,m,l[MAXN],r[MAXN],num=0,p,ch,ans=0,S,T,k,dis[MAXN],an=0,mi[MAXN],ro[MAXN],qi[MAXN],a,d,fa,fb,f,v;
na b[MAXM];
bool bo[MAXN];
const int INF=1e9;
queue <int> q;
inline int min(int x,int y){return x>y?y:x;}
inline int read(){
    p=0;ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while (ch>='0'&&ch<='9') p=p*10+ch-48, ch=getchar();
    return p;
}
inline void spfa(){
    register int i;
    q.push(S);
    bo[S]=1;
    for (i=0;i<MAXN;i++) dis[i]=INF;
    mi[S]=INF;dis[S]=0;
    while(!q.empty()){
        int k=q.front();q.pop();bo[k]=0;
        if (k==T) continue;
        for (i=l[k];i;i=b[i].ne){
            if (b[i].z>0&&dis[b[i].y]>b[i].f+dis[k]){
                dis[b[i].y]=b[i].f+dis[k];
                mi[b[i].y]=min(mi[k],b[i].z);
                ro[b[i].y]=i;
                qi[b[i].y]=k;
                if (!bo[b[i].y]){
                    bo[b[i].y]=1;
                    q.push(b[i].y);
                }
            }
        }
    }
}
inline int add(int x,int y,int z,int f){
    num++;
    if (l[x]==0) l[x]=num;else b[r[x]].ne=num;
    b[num].y=y;b[num].z=z;b[num].f=f;r[x]=num;
}
inline void in(int x,int y,int z,int f){
    add(x,y,z,f),add(y,x,0,-f);
}
int main(){
    register int i,j;
    n=read();a=read();d=read();f=read();fa=read();fb=read();
    S=2*n+1;T=2*n+2;
    for (i=1;i<=n;i++) v=read(),in(S,i,v,0),in(i+n,T,v,0),in(S,i+n,INF,f);
    for (i=1;i<n-a;i++) in(i,i+n+a+1,INF,fa);
    for (i=1;i<n-d;i++) in(i,i+n+d+1,INF,fb);
    for (i=1;i<n;i++) in(i,i+1,INF,0);
    for(;;){
        spfa();
        if (dis[T]==INF) break;
        an+=mi[T]*dis[T];
        for (i=T;i;i=qi[i]) b[ro[i]].z-=mi[T],b[((ro[i]-1)^1)+1].z+=mi[T];
    }
      printf("%d\n",an);
}

 

posted @ 2016-02-13 11:19  swm_sxt  阅读(174)  评论(0编辑  收藏  举报