Selecting Courses 题意: 一门课在一周可能开设多次,它们都是等价的。一个学生不能在统一时间段同时上两门课。问如何选尽可能多的课。这道题是考查二分图最大匹配,直接按照经典算法实现即可。两位也可以转换成最大流问题。
// http://poj.org/problem?id=2239
// 二分图最大匹配
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define MAX_N 310
#define MAX_M 100
bool map[MAX_N][MAX_M];
int match[MAX_M];
bool use[MAX_N];
int Course;
bool dfs(int p)
{
int i, t;
for(int i = 0; i < MAX_M; i++)
{
if(map[p][i] && !use[i])
{
use[i] = true;
if(match[i] == -1 || dfs(match[i]))
{
match[i] = p;
return true;
}
}
}
return false;
}
int main()
{
//freopen("data.txt", "r", stdin);
while(cin >> Course)
{
memset(map, false, sizeof(map));
memset(match, -1, sizeof(match));
for(int i = 0; i < Course; i++)
{
int pari;
int day;
int classTime;
cin >> pari;
for(int j = 0; j < pari; j++)
{
cin >> day >> classTime;
int classNum = (day - 1) * 12 + (classTime - 1);
map[i][classNum] = true;
}
}
int selectNum = 0;
for(int i = 0; i < Course; i++)
{
memset(use, false, sizeof(use));
if(dfs(i))
selectNum++;
}
cout << selectNum << endl;
}
return 0;
}