想看更多的解题报告:http://iyenn.com/rec/1824570.html
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:有n个奶牛和m个谷仓,现在每个奶牛有自己喜欢去的谷仓,并且它们只会去自己喜欢的谷仓吃东西,问最多有多少奶牛
能够吃到东西
输入第一行给出n与m
接着n行
每行第一个数代表这个奶牛喜欢的谷仓的个数P,后面接着P个数代表这个奶牛喜欢哪个谷仓
解题思路:这里行代表奶牛,列代表谷仓
将奶牛喜欢哪个谷仓就连一条边,然后求二分图的最大匹配数即可
- /*
- Memory 340K
- Time 16MS
- */
- #include
- using namespace std;
- #define MAXV 205
-
- int n,m,map[MAXV][MAXV];
- int link[MAXV],use[MAXV];
-
- int dfs(int cap){
- int i,j;
- for(i=1;i<=m;i++)
- if(map[cap][i] && !use[i]){
- use[i]=1;
- j=link[i];
- link[i]=cap;
- if(j==-1 || dfs(j)) return true;
- link[i]=j;
- }
- return false;
- }
-
- int hungary(){
- int num=0;
- int i,j;
- memset(link,-1,sizeof(link));
- for(i=1;i<=n;i++){
- for(j=1;j<=m;j++) use[j]=0;
- if(dfs(i)) num++;
- }
- return num;
- }
-
- int main(){
- int i,j,num,tmp;
- while(~scanf("%d%d",&n,&m)){
- memset(map,0,sizeof(map));
-
- for(i=1;i<=n;i++){
- scanf("%d",&num);
- for(j=1;j<=num;j++){
- scanf("%d",&tmp);
- map[i][tmp]=1;
- }
- }
-
- printf("%d\n",hungary());
- }
- return 0;
- }
评论记录:
回复评论: