Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 4472 | Accepted: 1884 |
Description
Input
Output
Sample Input
2 2 0 1 0 1 0 1 0 9 3 0 1 1 1 0 0 0 6 4 2 0 1 0 1 0 1 0 9 4 0 1 1 1 0 0 0 6 2
Sample Output
Yes No
Hint
A proper schedule for the first test case: date Sun Mon Tue Wed Thu Fri Sat week1 film1 film2 film1 film1 week2 film1 film2 film1 film1 week3 film1 film2 film1 film1 week4 film2 film2 film2
Source
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; #define E 20000 #define N 400 #define typec int const typec inf=0x3f3f3f3f; int day[N][10]; struct edge{int x,y,nxt;typec c;}bf[E]; int ne,head[N],cur[N],ps[N],dep[N]; void addedge(int x,int y,typec c) { bf[ne].x=x;bf[ne].y=y;bf[ne].c=c; bf[ne].nxt=head[x];head[x]=ne++; bf[ne].x=y;bf[ne].y=x;bf[ne].c=0; bf[ne].nxt=head[y];head[y]=ne++; } typec flow(int n,int s,int t) { typec tr,res=0; int i,j,k,f,r,top; while(1) { memset(dep,-1,n*sizeof(int)); for(f=dep[ps[0]=s]=0,r=1;f!=r;) { for(i=ps[f++],j=head[i];j;j=bf[j].nxt) { if(bf[j].c&&-1==dep[k=bf[j].y]) { dep[k]=dep[i]+1;ps[r++]=k; if(k==t){f=r;break;} } } } if(-1==dep[t])break; memcpy(cur,head,n*sizeof(int)); for(i=s,top=0;;) { if(i==t) { for(k=0,tr=inf;k<top;k++) { if(bf[ps[k]].c<tr) tr=bf[ps[f=k]].c; } for(k=0;k<top;++k) { bf[ps[k]].c-=tr,bf[ps[k]^1].c+=tr; } res+=tr;i=bf[ps[top=f]].x; } for(j=cur[i];cur[i];j=cur[i]=bf[cur[i]].nxt) if(bf[j].c&&dep[i]+1==dep[bf[j].y])break; if(cur[i]) { ps[top++]=cur[i];i=bf[cur[i]].y; } else { if(0==top)break; dep[i]=-1;i=bf[ps[--top]].x; } } } return res; } int main() { int tcase,n,s,i,j; scanf("%d",&tcase); while(tcase--) { ne=2; memset(head,0,sizeof(head)); scanf("%d",&n); s=0; for(i=1;i<=350;i++) { addedge(i,371,1); } for(i=1;i<=n;i++) { for(j=0;j<9;j++) { scanf("%d",&day[i][j]); } s+=day[i][7]; addedge(0,350+i,day[i][7]); for(j=0;j<7;j++) if(day[i][j]) { for(int k=1;k<=day[i][8];k++) addedge(350+i,7*(k-1)+j+1,1); } } if(flow(372,0,371)==s) printf("Yes\n"); else printf("No\n"); } return 0; }