题目链接:POJ 2239 Selecting Courses
把课程看成X集合里的点,上课时间看成Y集合里的点,把上课时间hash一下,比如写成12 * (day - 1) + num就可以建图了,然后就是匈牙利了,做KM突然蹦出来一个这题,大脑瞬间有点短路。。把两个集合搞反了,找了好久才找到原因。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 300 + 30;
bool G[MAX_N][MAX_N], vis[MAX_N];
int link[MAX_N];
int n1, n2;
bool DFS(int u)
{
for(int i = 1; i <= n2; i++)
{
if(!vis[i] && G[u][i])
{
vis[i] = 1;
if(link[i] == -1 || DFS(link[i]))
{
link[i] = u;
return true;
}
}
}
return false;
}
int MaxMatch()
{
int num = 0;
memset(link, -1, sizeof(link));
for(int i = 1; i <= n1; i++)
{
memset(vis, 0, sizeof(vis));
if(DFS(i))
num++;
}
return num;
}
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
memset(G, 0, sizeof(G));
int cnt, day, num, _max = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d", &cnt);
for(int j = 0; j < cnt; j++)
{
scanf("%d%d", &day, &num);
G[i][12 * (day - 1) + num] = 1;
_max = max(_max, 12 * (day - 1) + num);
}
}
n1 = n, n2 = _max;
printf("%d\n", MaxMatch());
}
return 0;
}