首页 > 代码库 > POJ 2239 Selecting Courses【最大匹配】
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。