赤裸裸的網路最大流...建圖還是沒有什麼技巧的... 繼續水...
#include<iostream>#include<string>#include<cstdio>#define MN 444using 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;}