POJ-2239 Selecting Courses 二分匹配

简单二分匹配

代码如下:

#include <stdio.h>
#include <string.h>
#define MAXN 100

int G[MAXN][305], N;
int marry[305], visit[305];

int path(int u)
{
for (int i = 1; i <= N; ++i) {
if (!G[u][i] || visit[i])
continue;
visit[i] = 1;
if (!marry[i] || path(marry[i])) {
marry[i] = u;
return 1;
}
}
return 0;
}

int main()
{
int t, d, h, count = 0;
while (scanf("%d", &N) == 1) {
count = 0;
memset(G, 0, sizeof (G));
memset(marry, 0, sizeof (marry));
for (int i = 1; i <= N; ++i) {
scanf("%d", &t);
for (int j = 0; j < t; ++j) {
scanf("%d %d", &d, &h);
G[(d-1)*12+h][i] = 1;
}
}
for (int i = 1; i <= 84; ++i) {
memset(visit, 0, sizeof (visit));
if (path(i))
++count;
}
printf("%d\n", count);
}
return 0;
}



posted @ 2012-03-27 09:53  沐阳  阅读(313)  评论(0编辑  收藏  举报