Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2136 Accepted Submission(s): 745
#include <iostream> #include <stdio.h> #include <queue> #include <stdio.h> #include <string.h> #include <vector> #include <queue> #include <set> #include <algorithm> #include <map> #include <stack> #include <math.h> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std ; typedef long long LL ; #define MAXN 1000 #define inf 2100000000 int g[MAXN][MAXN],level[MAXN]; int bfs(int n,int s,int t){ int que[1000],head,tail,i; head=tail=0; que[tail++]=s; memset(level,-1,sizeof(level)); level[s]=1; while(head<tail){ int x=que[head++]; for(i=1;i<=n;++i) if((g[x][i])&&(level[i]==-1)){ level[i]=level[x]+1; que[tail++]=i; } } return level[t]+1; } /*n为最大点,s起点 ,t终点 ,图中没有定点0,从1开始到n*/ int dinic(int n,int s,int t){ int maxflow=0,i; while(bfs(n,s,t)){ int pos,path[MAXN],cut=0,low,find; pos=0; path[pos++]=s;find=1; while(1){ find=1; low=inf; while((path[pos-1]!=t)&&(find)){ find=0; for(i=1;i<=n;++i) if((level[i]==level[path[pos-1]]+1)&&(g[path[pos-1]][i])){ path[pos++]=i; find=1; break; } else if (i==n) break; } if(path[pos-1]==t){ for(i=0;i<pos-1;++i){ if(low>g[path[i]][path[i+1]]){ low=g[path[i]][path[i+1]]; cut=i; } } maxflow+=low; for(i=0;i<pos-1;++i){ g[path[i]][path[i+1]]-=low; g[path[i+1]][path[i]]+=low; } pos=cut+1; } else{ if(pos==1) break; else{ level[path[pos-1]]=-1; pos--; } } } } return maxflow; } const int Max_N=208 ; char str[Max_N][Max_N] ; int food[Max_N] ; int drink[Max_N] ; int S ,T ; int main(){ int F , N , D ; while(scanf("%d%d%d",&N,&F,&D)!=EOF){ memset(g,0,sizeof(g)) ; for(int i=1;i<=F;i++) scanf("%d",&food[i]) ; for(int i=1; i<=D ;i++) scanf("%d",&drink[i]) ; for(int i=1;i<=N;i++) scanf("%s",str[i]+1) ; for(int i=1;i<=N;i++) for(int j=1;j<=F;j++){ if(str[i][j]=='Y') g[j][F+i]=1 ; } for(int i=1;i<=N;i++) scanf("%s",str[i]+1) ; for(int i=1;i<=N;i++) for(int j=1;j<=D;j++){ if(str[i][j]=='Y') g[F+N+i][F+N+N+j]=1 ; } for(int i=1;i<=N;i++) g[F+i][F+N+i]=1 ; T=F+N+N+D+1 ; S=F+N+N+D+1+1 ; for(int i=1;i<=D;i++) g[F+N+N+i][T]=drink[i] ; for(int i=1;i<=F;i++) g[S][i]=food[i] ; cout<<dinic(S,S,T)<<endl ; } return 0 ; }