bool solve(int n,int num) { int maxx=n*(n-1)/2,s=0,t=n+maxx+1; bool win[N]={0}; g.Clearall(); g.Resize(t+1); for(int i=1; i<=n; i++) g.Addedge(s,i,score[i]); for(int j=1; j<=maxx; j++) g.Addedge(j+n,t,1); for(int i=n-num+1; i<=n; i++) for(int j=first_great[i]; j<=n; j++) { win[match_num[i][j]]=true; g.Addedge(i,n+match_num[i][j],1); } for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(i!=j&&win[match_num[i][j]]==false) g.Addedge(i,match_num[i][j]+n,1); int ans=g.MaxFlow(s,t); if(ans==maxx) return true; return false; }
int main() { int T,n,m,sum=0; read(T); for(int cas=1;cas<=T;cas++) { read(n),read(m);sum=0; g.Clearall(); g.Resize(n+m+2); for(int i=1,u;i<=n;i++) { read(u);g.Addedge(0,i,u); sum+=u; } for(int i=1,u;i<=m;i++) { read(u);g.Addedge(n+i,n+m+1,u); } for(int i=1,k;i<=n;i++) { read(k); for(int j=0,a;j<k;j++) { read(a); g.Addedge(i,n+a+1,INF); } } for(int i=1,a;i<=m;i++) for(int j=1;j<=m;j++) { read(a); if(a) g.Addedge(n+i,n+j,INF); } printf("Case #%d: ",cas); printf("%d\n",sum-g.MaxFlow(0,n+m+1)); } return 0; }