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

按分段函数拆点跑费用流。

posted on 2016-03-20 22:35  xiyuedong  阅读(156)  评论(0编辑  收藏  举报