zoukankan      html  css  js  c++  java
  • bzoj 1221: [HNOI2001] 软件开发

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #define M 10001
     5 #define inf 2139062143
     6 using namespace std;
     7 int cnt=1,sum,T,n,a,b,f1,fa,fb,a1[M],d[M],fr[M],f[M],q[2*M],head[M],fro[100*M],next[100*M],u[100*M],v[100*M],w[100*M];
     8 int ans;
     9 void jia1(int a1,int a2,int a3,int a4)
    10 {
    11     cnt++;
    12     next[cnt]=head[a1];
    13     head[a1]=cnt;
    14     fro[cnt]=a1;
    15     u[cnt]=a2;
    16     v[cnt]=a3;
    17     w[cnt]=a4;
    18 }
    19 bool spfa()
    20 {
    21     memset(d,127,sizeof(int)*(T+1));
    22     d[0]=0;
    23     f[0]=1;
    24     q[1]=0;
    25     int h=0,t=1;
    26     for(;h<t;)
    27       {
    28         h++;
    29         int p=q[h];
    30         f[p]=0;
    31         for(int i=head[p];i;i=next[i])
    32           if(v[i]&&d[u[i]]>d[p]+w[i])
    33             {
    34                 d[u[i]]=d[p]+w[i];
    35                 fr[u[i]]=i;
    36                 if(!f[u[i]])
    37                   {
    38                     f[u[i]]=1;
    39                     t++;
    40                     q[t]=u[i];
    41                     }
    42             }
    43       }
    44     if(d[T]!=inf)
    45       return 1;
    46     return 0;
    47 }
    48 void mcf()
    49 {
    50     int mx=inf;
    51     for(int i=fr[T];i;i=fr[fro[i]])
    52       mx=min(mx,v[i]);
    53     for(int i=fr[T];i;i=fr[fro[i]])
    54       {
    55         v[i]-=mx;
    56         v[i^1]+=mx;
    57         ans+=mx*w[i];
    58       }
    59     return;
    60 }
    61 void jia(int a1,int a2,int a3,int a4)
    62 {
    63     jia1(a1,a2,a3,a4);
    64     jia1(a2,a1,0,-a4);
    65     return;
    66 }
    67 int main()
    68 {
    69     scanf("%d%d%d%d%d%d",&n,&a,&b,&f1,&fa,&fb);
    70     for(int i=1;i<=n;i++)
    71       scanf("%d",&a1[i]);
    72     T=2*n+1;
    73     for(int i=1;i<=n;i++)
    74       {
    75         if(i<n)
    76           jia(i,i+1,inf,0);
    77         jia(0,i,a1[i],0);
    78         jia(0,i+n,inf,f1);
    79         jia(i+n,T,a1[i],0);
    80         int b1=i+a+1;
    81         if(b1<=n)
    82           jia(i,n+b1,inf,fa);
    83         b1=i+b+1;
    84         if(b1<=n)
    85           jia(i,n+b1,inf,fb);   
    86       }
    87     for(;spfa();)
    88       mcf();
    89     printf("%d
    ",ans);
    90     return 0;
    91 }

    对每一天进行拆点 S到i1连容量为ni,费用为0的边,S到i2连容量为inf,费用为f的边,i2到T连容量为ni,费用为0的边,i1到(i+1)连容量为inf,费用为0的边。

    i1到(i+a)2连容量为inf,费用为fa的边,i1到(i+b)2连容量为inf,费用为fb的边。

  • 相关阅读:
    Day60
    Day53
    Day50
    Day49
    Day48
    Day47
    Day46(2)
    Day46(1)
    Day45
    Day44
  • 原文地址:https://www.cnblogs.com/xydddd/p/5243699.html
Copyright © 2011-2022 走看看