赤裸裸的网络最大流...建图还是没有什么技巧的... 继续水...
#include<iostream>
#include<string>
#include<cstdio>
#define MN 444
using namespace std;
int s,t,ans,w[8],Sum;
int map[MN][MN],vis[MN],a[MN],pre[MN],que[MN];
void setG()
{
Sum=0;s=0;ans=0;
int n,d,l,i,j,a,b,m=0;
memset( map,0,sizeof(map) );
scanf( "%d",&n );
for( i=1;i<=n;i++ )
{
for( j=1;j<=7;j++ )
scanf( "%d",&w[j] );
scanf( "%d%d",&map[0][i],&l );
m=max(l,m);
Sum+=map[0][i];
for( a=0;a<l;a++ )
for( b=1;b<=7;b++ )
if( w[b] ) map[i][n+a*7+b]=1;
}
t=m*7+n+1;
for( i=n+1;i<t;i++ )
map[i][t]=1;
}
bool bfs()
{
int head=0,foot=0;
memset( vis,0,sizeof(vis) );
memset( a,0,sizeof(a) );
que[foot++]=s;
vis[s]=true;
a[s]=INT_MAX;
while( head<foot )
{
int u=que[head++];
for( int i=0;i<=t;i++ )
{
if( !vis[i]&&map[u][i] )
{
a[i]=min( a[u],map[u][i] );
vis[i]=true;
pre[i]=u;
que[foot++]=i;
if( i==t )return true;
}
}
}
return false;
}
void EK()
{
while( bfs() ){
int m=t;
ans+=a[t];
while( m!=s ){
map[pre[m]][m]-=a[t];
map[m][pre[m]]+=a[t];
m=pre[m];
}
}
printf( ans==Sum?"Yes\n":"No\n" );
}
int main()
{
int T;scanf( "%d",&T );
while( T-- ){
setG();
EK();
}
return 0;
}