• bzoj1221[HNOI2001] 软件开发


    bzoj1221[HNOI2001]软件开发

    题意:

    n天,每天需要ai条消毒毛巾,这种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种,A种方式的消毒需要a天时间,一条费用fA,B种方式的消毒需要b天,一条费用fB,买一块新毛巾的费用为f(新毛巾是已消毒的,当天可以使用),求最小费用。n≤1000

    题解:

    费用流。每天拆成x和y。s向所有x连边表示有的毛巾,所有y向t连边表示用的毛巾,流量为需要毛巾数费用0。xi向yi+a连边,表示a方式消毒,xi向yi+b连边,表示b方式消毒,s向所有y连边,表示买新的,xi向xi+1连边,表示前一天没用的拿到第二天用。反思:费用流关键是要抓住“流量优先”。

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <queue>
     5 #define inc(i,j,k) for(int i=j;i<=k;i++)
     6 #define maxn 3000
     7 #define INF 0x3fffffff
     8 using namespace std;
     9 
    10 struct e{int f,t,c,w,n;}; e es[maxn*40]; int ess,g[maxn];
    11 inline void pe(int f,int t,int c,int w){
    12     es[++ess]=(e){f,t,c,w,g[f]}; g[f]=ess; es[++ess]=(e){t,f,0,-w,g[t]}; g[t]=ess;
    13 }
    14 void init(){ess=-1; memset(g,-1,sizeof(g));}
    15 int d[maxn],fr[maxn]; bool inq[maxn]; queue <int> q;
    16 bool spfa(int s,int t){
    17     while(!q.empty())q.pop(); memset(inq,0,sizeof(inq)); memset(d,-1,sizeof(d));
    18     inq[s]=1; d[s]=0; q.push(s); fr[s]=-1;
    19     while(! q.empty()){
    20         int x=q.front(); q.pop(); inq[x]=0;
    21         for(int i=g[x];i!=-1;i=es[i].n)if(es[i].c&&(d[es[i].t]==-1||d[es[i].t]>d[x]+es[i].w)){
    22             d[es[i].t]=d[x]+es[i].w; fr[es[i].t]=i; if(!inq[es[i].t])inq[es[i].t]=1,q.push(es[i].t);
    23         }
    24     }
    25     return d[t]!=-1;
    26 }
    27 int advanced(int s,int t){
    28     int a=INF,c=0;
    29     for(int i=fr[t];i!=-1;i=fr[es[i].f])a=min(a,es[i].c);
    30     for(int i=fr[t];i!=-1;i=fr[es[i].f])es[i].c-=a,es[i^1].c+=a,c+=(a*es[i].w);
    31     return c;
    32 }
    33 int maxflowmincost(int s,int t){
    34     int c=0; while(spfa(s,t))c+=advanced(s,t); return c;
    35 }
    36 int n,a,b,f,fa,fb,s,t,x;
    37 int main(){
    38     scanf("%d%d%d%d%d%d",&n,&a,&b,&f,&fa,&fb); s=0; t=2*n+1; init();
    39     inc(i,1,n)scanf("%d",&x),pe(s,i,x,0),pe(n+i,t,x,0);
    40     inc(i,1,n){
    41         if(i+a<n)pe(i,n+i+a+1,INF,fa); if(i+b<n)pe(i,n+i+b+1,INF,fb);
    42         if(i<n)pe(i,i+1,INF,0); pe(s,i+n,INF,f);
    43     }
    44     printf("%d",maxflowmincost(s,t)); return 0;
    45 }

    20160602

  • 相关阅读:
    vue2.0 之 douban (二)创建自定义组件tabbar
    vue2.0 之 douban (一)框架搭建 及 整体布局
    react-navigation
    react-native modal
    javascript-使用el表达式获取后台传递的数据
    java Map
    java List集合
    javascript 自定义Map
    javascript Array(数组)
    ZOJ 3868 GCD Expectation (容斥+莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/YuanZiming/p/5689473.html
Copyright © 2020-2023  润新知