有F种食物和D种饮料,每种食物或饮料只能供有限次,且每个人只享用一种食物和一种饮料。现在有n个人,每个人都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几个人同时享用到自己喜欢的食物和饮料。
邻接矩阵 DINIC 在定点数较多的时候比较慢。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string> 7 #include <vector> 8 #include <set> 9 #include <map> 10 #include <stack> 11 #include <queue> 12 #include <sstream> 13 #include <iomanip> 14 using namespace std; 15 typedef long long LL; 16 const int INF = 0x4fffffff; 17 const double EXP = 1e-5; 18 const int MS = 205; 19 const int SIZE = 100005; 20 21 int edges[4*MS][4*MS]; 22 int level[4*MS]; 23 int que[6*MS]; 24 char str[MS]; 25 int qs,qe; 26 int n,f,d,cnt; 27 28 bool BFS() 29 { 30 memset(level,0xff,sizeof(level)); 31 level[0]=0; 32 qs=qe=0; 33 que[qe++]=0; 34 while(qs<qe) 35 { 36 int u=que[qs++]; 37 for(int v=0;v<=cnt;v++) 38 { 39 if(level[v]<0&&edges[u][v]>0) 40 { 41 level[v]=level[u]+1; 42 que[qe++]=v; 43 } 44 } 45 } 46 return level[cnt]>0; 47 } 48 49 int DFS(int u,int minv) 50 { 51 if(u==cnt) 52 return minv; 53 int t; 54 for(int v=0;v<=cnt;v++) 55 { 56 if(edges[u][v]>0&&level[v]==level[u]+1&&(t=DFS(v,min(minv,edges[u][v])))) 57 { 58 edges[u][v]-=t; 59 edges[v][u]+=t; 60 return t; 61 } 62 } 63 level[u]=0xff; 64 return 0; 65 } 66 67 int main() 68 { 69 while(scanf("%d%d%d",&n,&f,&d)!=EOF) 70 { 71 memset(edges,0,sizeof(edges)); 72 int w; 73 for(int i=1;i<=f;i++) 74 { 75 scanf("%d",&w); 76 edges[0][i]=w; 77 } 78 // 0 1--> f, f+1--->f+n, f+n+1 --> f+2*n f+2*n+1-->f+2*n+d f+2*n+d+1; 79 for(int i=1;i<=n;i++) 80 edges[f+i][f+n+i]=1; 81 cnt=f+2*n+d+1; 82 for(int i=1;i<=d;i++) 83 { 84 scanf("%d",&w); 85 edges[f+2*n+i][cnt]=w; 86 } 87 for(int i=1;i<=n;i++) 88 { 89 scanf("%s",str); 90 for(int j=0;j<f;j++) 91 { 92 if(str[j]==‘Y‘) 93 { 94 edges[j+1][f+i]=1; 95 } 96 } 97 } 98 99 for(int i=1;i<=n;i++) 100 { 101 scanf("%s",str); 102 for(int j=0;j<d;j++) 103 { 104 if(str[j]==‘Y‘) 105 { 106 edges[f+n+i][f+2*n+j+1]=1; 107 } 108 } 109 } 110 int ans=0; 111 int t; 112 while(BFS()) 113 { 114 while(t=DFS(0,INF)) 115 { 116 ans+=t; 117 } 118 } 119 printf("%d\n",ans); 120 } 121 return 0; 122 }
时间: 2024-11-07 02:02:14