Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3399 Accepted Submission(s): 1141
题意:
一个餐馆有F种食物和D种饮料,每种食物和饮料都有固定的量,和N个顾客。
每个顾客会同时点饮料和食物,而且只会点他们喜欢的食物和饮料。
若顾客没有得到他喜欢的饮料和食物,则这位顾客不满意,会马上离开。
问要怎么分配食物和饮料给顾客,使得尽量多的顾客满意。
网络流
建图:S-食物F—顾客N—顾客N—饮料D—T
S和F,边的容量为食物的量
F和N,若顾客喜欢该种食物,则他们之间有一条容量为1的边
N和N,相应的点加边,容量为1(保证了每个顾客只点一份饮料+食物)
N和D,若顾客喜欢该种饮料,则加边,容量为1
D和T,边的容量为饮料的量
然后跑一遍dinic,即可。
问题:
1.刚开始,数组edge忘记初始化了
2.初始化的时候从下标1开始,而下标0(即源点)忘记初始化了
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #include<queue> 6 7 using namespace std; 8 9 const int MAXN=810; 10 const int INF=0x3f3f3f3f; 11 12 struct Edge 13 { 14 int to,cap,rev; 15 }; 16 vector<Edge>edge[MAXN]; 17 int level[MAXN]; 18 int iter[MAXN]; 19 const int S=0; 20 int T; 21 char str[205]; 22 23 void addedge(int u,int v,int cap) 24 { 25 edge[u].push_back((Edge){v,cap,edge[v].size()}); 26 edge[v].push_back((Edge){u,0,edge[u].size()-1}); 27 } 28 29 void bfs() 30 { 31 memset(level,-1,sizeof(level)); 32 queue<int>que; 33 while(!que.empty()) 34 que.pop(); 35 36 level[S]=0; 37 que.push(S); 38 while(!que.empty()) 39 { 40 int u=que.front(); 41 que.pop(); 42 for(int i=0;i<edge[u].size();i++) 43 { 44 Edge &e=edge[u][i]; 45 if(e.cap>0&&level[e.to]<0) 46 { 47 level[e.to]=level[u]+1; 48 que.push(e.to); 49 } 50 } 51 } 52 } 53 54 int dfs(int u,int f) 55 { 56 if(u==T) 57 return f; 58 for(int &i=iter[u];i<edge[u].size();i++) 59 { 60 Edge &e=edge[u][i]; 61 if(e.cap>0&&level[e.to]>level[u]) 62 { 63 int d=dfs(e.to,min(f,e.cap)); 64 if(d>0) 65 { 66 e.cap-=d; 67 edge[e.to][e.rev].cap+=d; 68 return d; 69 } 70 } 71 } 72 return 0; 73 } 74 75 int max_flow() 76 { 77 int flow=0; 78 while(true) 79 { 80 bfs(); 81 if(level[T]<0) 82 return flow; 83 memset(iter,0,sizeof(iter)); 84 int f; 85 while(f=dfs(S,INF)>0) 86 { 87 flow+=f; 88 } 89 } 90 } 91 92 int main() 93 { 94 int N,F,D; 95 while(~scanf("%d%d%d",&N,&F,&D)) 96 { 97 for(int i=0;i<MAXN;i++) 98 edge[i].clear(); 99 100 T=F+2*N+D+1; 101 for(int i=1;i<=F;i++) 102 { 103 int w; 104 scanf("%d",&w); 105 addedge(S,i,w); 106 } 107 for(int i=1;i<=D;i++) 108 { 109 int w; 110 scanf("%d",&w); 111 addedge(F+2*N+i,T,w); 112 } 113 for(int i=1;i<=N;i++) 114 { 115 addedge(i+F,i+N+F,1); 116 } 117 for(int i=1;i<=N;i++) 118 { 119 scanf("%s",str); 120 for(int j=1;j<=F;j++) 121 { 122 if(str[j-1]=='Y') 123 addedge(j,F+i,1); 124 } 125 } 126 for(int i=1;i<=N;i++) 127 { 128 scanf("%s",str); 129 for(int j=1;j<=D;j++) 130 { 131 if(str[j-1]=='Y') 132 addedge(F+N+i,F+2*N+j,1); 133 } 134 } 135 136 int flow=max_flow(); 137 138 printf("%d\n",flow); 139 } 140 141 return 0; 142 }