Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 17895 | Accepted: 8143 |
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
n牛,m个房子,每个牛都只住在自己想住的房子里面,一个房子只能住一个牛,问最多可以安排多少头牛入住;
像案例里的,第一头牛只愿意住2,5;第二头牛,只住2,3,4;第三头只住1,5;第四头只住1,2,5;第五头住2;
通过匈牙利算法可求得结果为4;
所以结果为4.
实现代码如下:
#include
#include
#include
#include
using namespace std;
const int M = 1000 + 5;
int n, m;
int link[M];
bool MAP[M][M];
bool cover[M];
int ans;
void init()
{
int num;
int y;
memset(MAP, false, sizeof(MAP));
for(int i=1; i<=n; i++)
{
scanf("%d", &num);
while( num-- )
{
scanf("%d", &y);
MAP[i][y]=true;
}
}
}
bool dfs(int x)
{
for(int y=1; y<=m; y++)
{
if(MAP[x][y] && !cover[y])
{
cover[y]=true;
if(link[y]==-1 || dfs(link[y]))
{
link[y]=x;
return true;
}
}
}
return false;
}
int main()
{
while(scanf("%d%d", &n, &m)!=EOF)
{
ans=0;
init();
memset(link, -1, sizeof(link));
for(int i=1; i<=n; i++)
{
memset(cover, false, sizeof(cover));
if( dfs(i) )
ans++;
}
printf("%d\n", ans);
}
return 0;
}