| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
囧……Dinic中的level的数量算小了,愣是没发现,WA*N
#include <cstdio>
#include <string.h>
using namespace std;
const int NMax=55;
struct edge {
int num,len;
edge *next,*rev;
}*A[1000],pool[30000];
int N,nn,L,D[NMax],W[NMax];
bool F[NMax][8];
void Build(int x,int y,int z) {
edge *p=&pool[L++],*q=&pool[L++];
p->num=y;p->len=z;p->next=A[x];A[x]=p;p->rev=q;
q->num=x;q->len=0;q->next=A[y];A[y]=q;q->rev=p;
}
int q[1000],level[1000];
bool makelevel() {
for(int i=1;i<=nn;i++) level[i]=-1;
q[0]=0;level[0]=0;
for(int i=0,bot=1;i<bot;i++) {
int tmp=q[i];
for(edge *p=A[tmp];p;p=p->next) if(p->len && level[p->num]==-1)
level[q[bot++]=p->num]=level[tmp]+1;
}
return level[nn]!=-1;
}
inline int min(int a,int b) {return a<b?a:b;}
int Find(int a,int alpha) {
if(a==nn) return alpha;
int tot=0,tmp;
for(edge *p=A[a];p && tot<alpha;p=p->next) {
if(p->len && level[p->num]==level[a]+1)
if(tmp=Find(p->num,min(p->len,alpha-tot))) {
tot+=tmp;
p->len-=tmp;
p->rev->len+=tmp;
}
}
if(!tot) level[a]=-1;
return tot;
}
int main()
{
int T,WMax;
scanf("%d",&T);
while(T--) {
L=0;memset(A,0,sizeof(A));
scanf("%d",&N);
WMax=0;
int tot=0;
for(int i=1;i<=N;i++) {
for(int j=1;j<=7;j++) scanf("%d",&F[i][j]);
scanf("%d%d",&D[i],&W[i]); tot+=D[i];
if(W[i]>WMax) WMax=W[i];
}
nn=N+7*WMax+1;
for(int i=1;i<=N;i++) {
Build(0,i,D[i]);
for(int j=1;j<=W[i];j++)for(int k=1;k<=7;k++) if(F[i][k])Build(i,N+(j-1)*7+k,1);
}
for(int i=1;i<=7*WMax;i++) Build(N+i,nn,1);
int ret=0,tmp;
while(makelevel())
while(tmp=Find(0,100000000)) ret+=tmp;
//printf("%d\n",ret);
puts(ret>=tot?"Yes":"No");
}
getchar();getchar();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator