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

bzoj 1221: [HNOI2001] 软件开发

时间:2016-03-05 00:12:00      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

 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的边。

bzoj 1221: [HNOI2001] 软件开发

标签:

原文地址:http://www.cnblogs.com/xydddd/p/5243699.html

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