题目大意:有n个奶牛和m个谷仓,现在每个奶牛有自己喜欢去的谷仓,并且它们只会去自己喜欢的谷仓吃东西,问最多有多少奶牛能够吃到东西
输入第一行给出n与m
接着n行
每行第一个数代表这个奶牛喜欢的谷仓的个数P,后面接着P个数代表这个奶牛喜欢哪个谷仓
#include<cstdio> #include<iostream> #include<cstring> #define M 510 using namespace std; int used[M],belong[M],a[M][M],n,m; int find(int i) { for(int j=1;j<=m;j++) if(!used[j]&&a[i][j]) { used[j]=1; if(!belong[j]||find(belong[j])) { belong[j]=i; return 1; } } return 0; } void work() { for(int i=1;i<=n;i++) { int x,y; scanf("%d",&x); for(int j=1;j<=x;j++) { scanf("%d",&y); a[i][y]=1; } } int tot=0; for(int i=1;i<=n;i++) { if(find(i)) { memset(used,0,sizeof(used)); tot++; } } printf("%d ",tot); } int main() { freopen("jh.in","r",stdin); while(scanf("%d%d",&n,&m)==2) { memset(a,0,sizeof(a)); memset(belong,0,sizeof(belong)); work(); } return 0; }