建图比较经典,巧妙,网络流和图论难就难在建立模型上。。。。
哎。。。。
贴个dinic模板吧。。
#include<iostream>
#define maxn 1300
#define inf 100000
using namespace std;
int f[110][110];
int d[110];
int cow[maxn];
int pre[maxn];
int N,M;
int bfs(int s)
{
    
int q[maxn];
    q[
0]=s;
    memset(d,
-1,sizeof(d));
    d[s]
=0;
    
int front=0,rear=1;
    
int j;
    
while(front<rear)
    {
        
int t=q[front++];
        
for(j=0;j<=N+1;j++)
        {
            
if(d[j]==-1&&f[t][j]>0)
            {
                d[j]
=d[t]+1;
                q[rear
++]=j;
            }
        }
    }
    
if(d[N+1]>=0)
        
return 1;
    
else return 0;
}
int dinic(int t,int sum)
{
    
int i;
    
if(t==N+1)
        
return sum;
    
int os=sum;
    
for(i=0;i<=N+1&&sum;i++)
    {
        
if(d[i]==d[t]+1&&f[t][i]>0)
        {
            
int a=dinic(i,min(sum,f[t][i]));
            f[t][i]
-=a;
            f[i][t]
+=a;
            sum
-=a;
        }
    }
    
return os-sum;
}
int main()
{
    scanf(
"%d%d",&M,&N);
    
int i,j,k,l;
    
int tol=0;
    
for(i=1;i<=M;i++)
    {
        scanf(
"%d",&cow[i]);
        tol
+=cow[i];
    }
    
for(i=1;i<=N;i++)
    {
        scanf(
"%d",&j);
        
for(l=1;l<=j;l++)
        {
            scanf(
"%d",&k);
            
if(pre[k]==0)
                f[
0][i]+=cow[k];
            
else
                f[pre[k]][i]
=tol;
            pre[k]
=i;
        }
        scanf(
"%d",&k);
        f[i][N
+1]=k;
    }
    
int res=0;
    
while(bfs(0))
    {
        res
+=dinic(0,INT_MAX);
    }
    printf(
"%d\n",res);
    
return 0;

}