题目大意
李明在学校选课,每组数据的第一行为n,代表可选课程的数目,然后接下来n行为课程的时间描述,每行开头一个数t代表该课程在一周内的开课次数,然后每次两个数p, q代表在星期几第几课,然后要求算出李明怎么样才能选尽可能多的课并且不会出现冲突.(真是好学生啊!!!!)
思路
此题就是匈牙利算法求最大匹配数的模板题;
code
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int MAX = 300+5;
int checkY[MAX];
int match[MAX];
vector<vector<int> > e(MAX);
bool find(int v) {
for(size_t i = 0; i < e[v].size(); ++ i) {
int to = e[v][i];
if(!checkY[to]) {
checkY[to] = 1;
if(match[to] == -1 || find(match[to])) {
match[to] = v;
return true;
}
}
}
return false;
}
int hungary(int n) {
int cnt = 0;
memset(match, -1, sizeof(match));
for(int i = 0; i < n; ++ i) {
memset(checkY, 0, sizeof(checkY));
cnt += find(i);
}
return cnt;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
//ifstream cin("data.in");
int n;
while(cin >> n) {
for(int i = 0; i < n; i ++) {
e[i].clear();
int t, p, q;
cin >> t;
while(t --) {
cin >> p >> q;
e[i].push_back((p-1)*12 + q);
}
}
cout << hungary(n) << endl;
}
return 0;
}