码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2239 二分图最大匹配

时间:2014-07-03 19:50:56      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   art   

问题:POJ2239

分析:

  本题给出每门课程的上课时间,求最大选课数,可以转化为二分图最大匹配问题求解。

  设集合A为课程集,集合B为上课时间集,根据输入建立二分图。最大选课书就是该二分图的最大匹配数,采用匈牙利算法即可解决。

  AC代码

 1 //Memory: 252K        Time: 16MS
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 
 6 using namespace std;
 7 
 8 const int maxl = 301;
 9 const int maxc = 85;
10 int edge[maxc][maxl];
11 int ne[maxc];
12 int match[maxl];
13 bool vis[maxl];
14 int n, t;
15 int a, b;
16 
17 bool findPath(int start)
18 {
19     for (int i = 0; i < ne[start]; i++){
20         int current = edge[start][i];
21         if (vis[current]) continue;
22         vis[current] = 1;
23         if ( !match[current] || findPath(match[current]) ){
24             match[current] = start;
25             return true;
26         }
27     }
28     return false;
29 }
30 
31 int solve()
32 {
33     memset(match, 0, sizeof(match));
34     int cnt = 0;
35     for (int i = 1; i <= 84; i++) {
36         memset(vis, 0, sizeof(vis));
37         if (findPath(i)) cnt++;
38     }
39     return cnt;
40 }
41 
42 void input()
43 {
44     memset(edge, 0, sizeof(edge));
45     memset(ne, 0, sizeof(ne));
46     for (int i = 0; i < n; i++){
47         scanf("%d", &t);
48         while (t--){
49             scanf("%d%d", &a, &b);
50             int class_num = (a - 1) * 12 + b;
51             edge[ class_num ][ ne[class_num]++ ] = i;
52         }
53     }
54 }
55 
56 int main()
57 {
58     while ( ~scanf("%d", &n) ){
59         input();
60         int ans = solve();
61         printf("%d\n", ans);
62     }
63     return 0;
64 }

 

 

POJ2239 二分图最大匹配,布布扣,bubuko.com

POJ2239 二分图最大匹配

标签:style   blog   http   color   os   art   

原文地址:http://www.cnblogs.com/junxie/p/3821326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!