Exemple #1
0
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;
}