The Perfect Stall 完美的牛栏 usaco 4.2.2
描述
农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术。不幸的是,由于工程问题,每个牛栏都不一样。第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶。上个星期,农夫约翰刚刚收集到了奶牛们的爱好的信息(每头奶牛喜欢在哪些牛栏产奶)。一个牛栏只能容纳一头奶牛,当然,一头奶牛只能在一个牛栏中产奶。
给出奶牛们的爱好的信息,计算最大分配方案。
格式
PROGRAM NAME: stall4
INPUT FORMAT:
(file stall4.in)
第一行 两个整数,N (0 <= N <= 200) 和 M (0 <= M <= 200) 。N 是农夫约翰的奶牛数量,M 是新牛棚的牛栏数量。
第二行到第N+1行 一共 N 行,每行对应一只奶牛。第一个数字 (Si) 是这头奶牛愿意在其中产奶的牛栏的数目 (0 <= Si <= M)。后面的 Si 个数表示这些牛栏的编号。牛栏的编号限定在区间 (1..M) 中,在同一行,一个牛栏不会被列出两次。
OUTPUT FORMAT:
(file stall4.out)
只有一行。输出一个整数,表示最多能分配到的牛栏的数量.
SAMPLE INPUT
5 5 2 2 5 3 2 3 4 2 1 5 3 1 2 5 1 2
SAMPLE OUTPUT
4
刚学最大流,就用最大流吧。
1 /* 2 ID:10239512 3 PROG:stall4 4 LANG:C++ 5 */ 6 //#include <iostream> 7 #include<fstream> 8 #include<cstring> 9 #define size 409 10 using namespace std; 11 ifstream cin("stall4.in"); 12 ofstream cout("stall4.out"); 13 14 int m,n,cf[size][size],pre[size],all=0; 15 16 int main() 17 { 18 cin>>n>>m; 19 int s=1,t=n+2+m; 20 21 for(int i=1;i<=n;++i) 22 cf[1][i+1]=1; 23 for(int i=n+1;i<=t-1;++i) 24 cf[i+1][t]=1; 25 26 for(int i=1;i<=n;++i) 27 { 28 int ans; 29 cin>>ans; 30 for(int j=1;j<=ans;++j) 31 { 32 int num; 33 cin>>num; 34 num+=n+1; 35 cf[i+1][num]=1; 36 } 37 } 38 39 int flag=1; 40 41 while(flag) 42 { 43 flag=0; 44 memset(pre,0,sizeof(pre)); 45 46 int q[1000],h=0,l=1; 47 q[1]=s; 48 49 while(h<l) 50 { 51 h++; 52 for(int i=2;i<=t;++i) 53 if(cf[q[h]][i]&&pre[i]==0) 54 { 55 pre[i]=q[h]; 56 if(i==t) {flag=1;break;} 57 q[++l]=i; 58 } 59 if(flag) break; 60 } 61 62 if(flag) 63 { 64 all++; 65 int num=t; 66 while(num!=1) 67 { 68 cf[pre[num]][num]-=1; 69 cf[num][pre[num]]+=1; 70 num=pre[num]; 71 } 72 } 73 } 74 75 cout<<all<<endl; 76 // system("pause"); 77 return 0; 78 79 }