Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 19174 | Accepted: 8696 |
Description
Input
Output
Sample Input
5 5 2 2 5 3 2 3 4 2 1 5 3 1 2 5 1 2
Sample Output
4
翻译:
农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术。
不幸的是,因为project问题,每一个牛栏都不一样。
第一个星期,农夫约翰随便地让奶牛们进入牛栏。可是问题非常快地显露出来:每头奶牛都仅仅愿意在她们喜欢的那些牛栏中产奶。上个星期。农夫约翰刚刚收集到了奶牛们的爱好的信息(每头奶牛喜欢在哪些牛栏产奶)。一个牛栏仅仅能容纳一头奶牛,当然,一头奶牛仅仅能在一个牛栏中产奶。
给出奶牛们的爱好的信息,计算最大分配方案。
#include <stdio.h> #include <string.h> #include <string> #include <math.h> #include <stdlib.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include<queue> #include<stack> using namespace std; int line[210][210]; int used[210]; int cow[210]; int n,m; int find(int x) { for(int i=1;i<=m;i++) //为这仅仅牛找一个棚 { if((line[x][i] && !used[i])) //假设这个牛棚适合这个牛 而且 这个棚没有其它牛 { used[i]=1; //标记此棚有牛 if(!cow[i] || find(cow[i]))// cow[i]这个棚还没有牛 或者 可以有牛的归宿 { cow[i]=x; //标记此棚有牛 return 1; } } } return 0; } int main() { while(~scanf("%d %d",&n,&m)) { int num=0; int t,k; memset(line,0,sizeof(line)) ; memset(cow,0,sizeof(cow)); for(int i=1;i<=n;i++) { cin>>t; for(int j=1;j<=t;j++) { cin>>k; line[i][k]=1; } } for(int i=1;i<=n;i++) { memset(used,0,sizeof(used));//为每仅仅牛找棚 前确保每一个棚都是空的 if(find(i)) num++; } cout<<num<<endl; } return 0; }
Poj-1274-The Perfect Stall-匈牙利算法
原文:http://www.cnblogs.com/yfceshi/p/6764771.html