POJ 2239 Selecting Courses【最大匹配】
大意:
有一些课程,每个课程的上课时间在每周可能会有多节,你可以从中任选一个时间去听课,
每周七天一天12节课 告诉你每节课的上课时间问在不冲突的情况下最多上几节课?
分析:
左集合课程
右集合时间
边为该节课对应的上课时间
求最大匹配就行了
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int maxn = 305; 8 const int maxm = 12 * 7 + 10; 9 10 int mat[maxn][maxm]; 11 12 const int m = 12 * 7; int n; 13 14 int vis[maxm]; 15 int Link[maxm]; 16 bool Find(int u) { 17 for(int i = 1; i <= m; i++) { 18 if( mat[u][i] && !vis[i]) { 19 vis[i] = 1; 20 if(Link[i] == -1 || Find(Link[i])) { 21 Link[i] = u; 22 return true; 23 } 24 } 25 } 26 return false; 27 } 28 29 int solve() { 30 memset(Link, -1, sizeof(Link)); 31 int cnt = 0; 32 for(int i = 1; i <= n; i++) { 33 memset(vis, 0, sizeof(vis)); 34 if(Find(i)) cnt++; 35 } 36 return cnt; 37 } 38 39 int main() { 40 int t, a, b; 41 while(EOF != scanf("%d",&n) ) { 42 memset(mat, 0, sizeof(mat)); 43 for(int i = 1; i <= n; i++) { 44 scanf("%d",&t); 45 for(int j = 0; j < t; j++) { 46 scanf("%d %d",&a, &b); 47 mat[i][(a - 1) * 12 + b] = 1; 48 } 49 } 50 printf("%d\n",solve()); 51 } 52 return 0; 53 }