pku 2239 Selecting Courses(二分图最大匹配)

 

http://acm.pku.edu.cn/JudgeOnline/problem?id=2239

 

题目大意:一个学生想要选课程去上课,一周有7天上课,每天都是12节课。一门课程每天只会上一次,并且每一天上课的班级并不一样。这个学生可以自由选课去哪个班级去上课,只要时间不冲突就好,问你他最多可以选几门课。

 

解题思路:课程作为X集合,(day-1)*12+班级号  作为Y集合,表示某个时间段,上某门课程。然后套模板就是了

 

#include <iostream> #include <vector> #include <string.h> #define Max 305 using namespace std; vector<int>List[Max]; bool visited[86]; int Match[86]; bool DFS(int locate) { int i,j,len = List[locate].size(); for (i=0;i<len;i++) { j = List[locate][i]; if (!visited[j]) { visited[j] = 1; if (Match[j]==-1||DFS(Match[j])) { Match[j] = locate; return 1; } } } return 0; } int main() { int n,i,a,b,m,count; while (scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) List[i].clear(); for (i=1;i<=n;i++) { scanf("%d",&m); while (m--) { scanf("%d%d",&a,&b); List[i].push_back((a-1)*12+b); } } memset(Match,-1,sizeof(Match)); for (i=1,count=0;i<=n;i++) { memset(visited,0,sizeof(visited)); if(DFS(i)) count++; } printf("%d/n",count); } return 0; }

你可能感兴趣的:(list)