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 }
View Code

 

posted @ 2014-08-18 19:59  悠悠我心。  阅读(128)  评论(0编辑  收藏  举报