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 Num,Edgenum; while(~scanf("%d%d",&Edgenum,&Num)) { g.ClearAll(Num); for(int i=0;i<Edgenum;i++) { int st,ed,cost; scanf("%d%d%d",&st,&ed,&cost);st--;ed--; g.AddEdge(st,ed,cost); } int ans=g.MaxFlow(0,Num-1); printf("%d\n",ans); } return 0; }
int check(double g) { mf.ClearAll(n+2); memset(deg, 0, sizeof(deg)); for(int i=1; i<=n; i++) for(int j = i+1; j <= n; j++) if(a[j] < a[i]) mf.AddEdge(i, j, 1), mf.AddEdge(j, i, 1), deg[i]++, deg[j]++; for(int i=1; i<=n; i++) mf.AddEdge(source, i, U); for(int i=1; i<=n; i++) mf.AddEdge(i, sink, g*2.0 + 1.0*U - 1.0*deg[i]); double curf = mf.Maxflow(source, sink); return dcmp((U*n - curf)/2.0); }
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; }