标签:
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 9363 | Accepted: 4164 |
Description
Input
Output
Sample Input
5 1 1 1 2 1 1 2 2 1 2 2 2 3 2 3 3 1 3 3
Sample Output
4
题意:
在大学里有许许多多的课程,现在小明需要去选择课程,他是一个爱学习的人,所以想尽可能多的选择课程,在学校里有n个课程,并且在学校规定,每周里的每天有12节课,那么一周就有7*12节课。输入第一行为n,代表有n个课程接下来n行,每行第一个数字x代表这个课程在这一周里面需要上x次。然后跟着x对数字,第一个D代表这周的哪一天,第二个C代表这天的哪一节课如果几个课程都在那d天的那c节课上课,那么你需要选择其中的一个,而不能选择多个课程现在要求算出小明最多可以选择多少个课程。
解析:我们把这一周的12 * 7节课编上号,每门课程和对应的节数建边,匈牙利算法求最大匹配数即可,水题一个。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 330
using namespace std;
int n, m;
int map[maxn][maxn];
int used[maxn];
int link[maxn];
void init(){
memset(map, 0, sizeof(map));
}
void getmap(){
for(int i = 1; i <= n; ++i){
int k;
scanf("%d", &k);
while(k--){
int a, b;
scanf("%d%d", &a, &b);
map[i][(a - 1) * 12 + b] = 1;
}
}
}
bool dfs(int x){
for(int i = 1; i <= 7 * 12; ++i){
if(map[x][i] && !used[i]){
used[i] = 1;
if(link[i] == -1 || dfs(link[i])){
link[i] = x;
return true;
}
}
}
return false;
}
int hungary(){
int ans = 0;
memset(link, -1, sizeof(link));
for(int i = 1; i <= n; ++i){
memset(used, 0, sizeof(used));
if(dfs(i))
ans++;
}
return ans;
}
int main (){
while(scanf("%d", &n) != EOF){
init();
getmap();
int sum = hungary();
printf("%d\n", sum);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 2239--Selecting Courses【二分图 && 最大匹配数 && 水题】
标签:
原文地址:http://blog.csdn.net/hpuhjh/article/details/48008107