【二分图+最大匹配+解题思路】北大 poj 2239 Selecting Courses

来源:互联网 发布:张靓颖 结婚 知乎 编辑:程序博客网 时间:2024/06/08 14:43


/* THE PROGRAM IS MADE BY PYY *//*----------------------------------------------------------------------------//Copyright (c) 2011 panyanyany All rights reserved.URL   : http://poj.org/problem?id=2239Name  : 2239 Selecting CoursesDate  : Monday, November 28, 2011Time Stage : one hourResult: 9607451panyanyany2239Accepted256K32MSC++1360B2011-11-28 20:46:55Test Data :Review :前言:貌似是比较裸的二分图之最大匹配,也许是因为最近做的题相对多一点吧,所以比较容易看出来。思路:把所有的课程(course)归类为一个点集,所有的课时(class)归类为另一个点集,课程编号为:1,2,3,...,300 ;课时编号为:1,2,3,...,84 (因为一星期共有 7*12 节课);每个课程有n个课时,即课程与课时之间有n条连线(或边)怎样才能上最多的课,即求课程与课时之间的最大匹配//----------------------------------------------------------------------------*/#include <stdio.h>#include <string.h>#include <vector>using namespace std ;#define MAXCOURSE301#define MAXCLASS85intn, t, p, q ;intlink[MAXCOURSE] ;boolcover[MAXCLASS] ;vector<int>graph[MAXCOURSE] ;bool find (int cur){int i, j ;for (i = 0 ; i < graph[cur].size () ; ++i){j = graph[cur][i] ;if (cover[j] == false){cover[j] = true ;if (link[j] == 0 || find (link[j])){link[j] = cur ;return true ;}}}return false ;}int main (){int i, j ;int x, y ;int sum ;while (~scanf ("%d", &n)){for (i = 1 ; i <= n ; ++i){graph[i].clear () ;scanf ("%d", &t) ;for (j = 1 ; j <= t ; ++j){scanf ("%d%d", &x, &y) ;graph[i].push_back ((x-1)*12 + y) ;}}sum = 0 ;memset (link, 0, sizeof (link)) ;for (i = 1 ; i <= n ; ++i){memset (cover, 0, sizeof (cover)) ;sum += find (i) ;}printf ("%d\n", sum) ;}return 0 ;}


原创粉丝点击