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\n",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的边。