#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define maxn 380
#define inf 0x7fffffff
int Cp[maxn][maxn];
int flow[maxn];
int pre[maxn];
int S,T;
int D[22];
queue<int>Q;
int bfs(int s,int t)
{
while(!Q.empty())Q.pop();
memset(pre,-1,sizeof(pre));
pre[s]=0;
Q.push(s);
flow[s]=inf;
while(!Q.empty())
{
int u=Q.front();
Q.pop();
if(u==t)break;
for(int i=1;i<=t;i++)
{
//if(i==t)break;
if(i!=s&&pre[i]==-1&&Cp[u][i]>0)
{
flow[i]=min(Cp[u][i],flow[u]);
pre[i]=u;
Q.push(i);
}
}
}
if(pre[t]==-1)return -1;
else return flow[t];
}
int maxflow(int s,int t)
{
int inc=0;
int us=0;
while(1)
{
inc=bfs(s,t);
if(inc==-1)break;
int k=t;
while(k!=s)
{
int last=pre[k];
Cp[last][k]-=inc;
Cp[k][last]+=inc;
k=last;
}
us+=inc;
}
if(us==-1)return -1;
else return us;
}
int main()
{
int kase;
cin>>kase;
while(kase--)
{
memset(Cp,0,sizeof(Cp));
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
{
int a[11];
for(int j=1;j<=9;j++)cin>>a[j];
sum+=a[8];
Cp[1][i+1]=a[8];
for(int k=1;k<=a[9];k++)
{
for(int j=1;j<=7;j++)
if(a[j]==1)
{
Cp[i+1][(20+1)+(k-1)*7+j]=1;
}
for(int j=1;j<=7;j++)
Cp[(20+1)+(k-1)*7+j][373]=1;
}
}
if(maxflow(1,373)==sum)cout<<"Yes"<<endl;
else cout<<"No\n";
}
return 0;
}
poj1698
最新推荐文章于 2018-07-30 17:04:36 发布