题目链接
我做的伤心了,不知是模版效率低,还是错了,交上就是TLE,找了份别人的代码,改了好几下终于过了。。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <map> 5 #include <iostream> 6 using namespace std; 7 #define INF 0x3fffffff 8 char food[201][201],drink[201][201]; 9 struct node 10 { 11 int u,v,next,re,w; 12 }edge[200001]; 13 int first[2001],dis[2001]; 14 int t,str,end; 15 void CL() 16 { 17 t = 1; 18 memset(first,-1,sizeof(first)); 19 } 20 void add(int u,int v,int w) 21 { 22 edge[t].u = u; 23 edge[t].v = v; 24 edge[t].w = w; 25 edge[t].re = t+1; 26 edge[t].next = first[u]; 27 first[u] = t++; 28 edge[t].u = v; 29 edge[t].v = u; 30 edge[t].w = 0; 31 edge[t].re = t-1; 32 edge[t].next = first[v]; 33 first[v] = t ++; 34 } 35 int bfs() 36 { 37 int u,v,i; 38 memset(dis,0xff,sizeof(dis)); 39 queue<int> que; 40 que.push(str); 41 dis[str] = 0; 42 while(!que.empty()) 43 { 44 u = que.front(); 45 que.pop(); 46 for(i = first[u];i != -1;i = edge[i].next) 47 { 48 v = edge[i].v; 49 if(edge[i].w > 0&&dis[v] < 0) 50 { 51 dis[v] = dis[u] + 1; 52 que.push(v); 53 } 54 } 55 } 56 if(dis[end] > 0) return 1; 57 else return 0; 58 } 59 int dfs(int u,int step) 60 { 61 int i,temp,v,tf = 0; 62 if(u == end) return step; 63 for(i = first[u];i != -1;i = edge[i].next) 64 { 65 v = edge[i].v; 66 if(edge[i].w > 0&&dis[v] == dis[u] + 1&&(temp = dfs(v,min(step,edge[i].w)))) 67 { 68 edge[i].w -= temp; 69 edge[edge[i].re].w += temp; 70 return temp; 71 } 72 } 73 if(!tf) dis[u] = -1;//注意这里 74 return tf; 75 } 76 int main() 77 { 78 int i,j,res,ans,n,f,d,temp; 79 while(scanf("%d%d%d",&n,&f,&d)!=EOF) 80 { 81 ans = 0; 82 str = 0; 83 end = 2000; 84 CL(); 85 for(i = 1; i <= f;i ++) 86 { 87 scanf("%d",&temp); 88 add(str,i,temp); 89 } 90 for(i = 1;i <= d;i ++) 91 { 92 scanf("%d",&temp); 93 add(f+i,end,temp); 94 } 95 for(i = 1;i <= n;i ++) 96 add(f+d+i,f+d+n+i,1); 97 for(i = 0;i < n;i ++) 98 { 99 scanf("%s",food[i]); 100 } 101 for(i = 0;i < n;i ++) 102 { 103 scanf("%s",drink[i]); 104 } 105 for(i = 0;i < n;i ++) 106 { 107 for(j = 0;j < f;j ++) 108 { 109 if(food[i][j] == 'Y') 110 add(j+1,f+d+i+1,1); 111 } 112 } 113 for(i = 0;i < n;i ++) 114 { 115 for(j = 0;j < d;j ++) 116 { 117 if(drink[i][j] == 'Y') 118 add(f+d+n+i+1,f+j+1,1); 119 } 120 } 121 while(bfs())//注意这部分 122 { 123 while(res = dfs(str,INF)) 124 ans+= res ; 125 } 126 printf("%d\n",ans); 127 } 128 return 0; 129 }