POJ2239 Selecting Courses(二分图最大匹配)

题目链接

N节课,每节课在一个星期中的某一节,求最多能选几节课

好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱

建图: 每节课 与 时间有一条边

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 using namespace std;
 8 const int N = 300 + 5;
 9 int vis[N], Left[N];
10 vector<int> g[N];
11 int n;
12 bool mach(int u)
13 {
14     int Size = g[u].size();
15     for (int i = 0; i < Size; i++)
16     {
17         int v = g[u][i];
18         if (!vis[v])
19         {
20             vis[v] = 1;
21             if (Left[v] == -1 || mach(Left[v]))
22             {
23                 Left[v] = u;
24                 return true;
25             }
26         }
27     }
28     return false;
29 }
30 int main()
31 {
32     while (scanf("%d", &n) != EOF)
33     {
34         int t, p, q;
35         for (int i = 0; i <= n; i++)
36             g[i].clear();
37         for (int i = 1; i <= n; i++)
38         {
39             scanf("%d", &t);
40             for (int j = 1; j <= t; j++)
41             {
42                 scanf("%d%d", &p, &q);
43                 g[i].push_back(p * 12 + q); // 可以将每一节转化成一个整数
44             }
45         }
46         memset(Left, -1, sizeof(Left));
47         int ans = 0;
48         for (int i = 1; i <= n; i++)
49         {
50             memset(vis, 0, sizeof(vis));
51             if (mach(i))
52                 ans++;
53         }
54         printf("%d\n", ans);
55     }
56     return 0;
57 }

时间: 2024-10-09 22:44:55

POJ2239 Selecting Courses(二分图最大匹配)的相关文章

poj2239 Selecting Courses --- 二分图最大匹配

匈牙利算法模板题 有n门课程,每门课程可能有不同一时候间,不同一时候间的课程等价. 问不冲突的情况下最多能选多少门课. 建立二分图,一边顶点表示不同课程,还有一边表示课程的时间(hash一下). #include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include

[POJ] 2239 Selecting Courses(二分图最大匹配)

题目地址:http://poj.org/problem?id=2239 Li Ming大学选课,每天12节课,每周7天,每种同样的课可能有多节分布在不同天的不同节.问Li Ming最多可以选多少节课.把n种课划分为X集合,把一周的84节课划分为Y集合, 从Xi向Yi连边,那么就转化成了求二分图的最大匹配数,然后匈牙利算法就可以了. 1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #includ

POJ 2239 Selecting Courses【最大匹配】

大意: 有一些课程,每个课程的上课时间在每周可能会有多节,你可以从中任选一个时间去听课, 每周七天一天12节课  告诉你每节课的上课时间问在不冲突的情况下最多上几节课? 分析: 左集合课程 右集合时间 边为该节课对应的上课时间 求最大匹配就行了 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std

POJ 1469 COURSES 二分图最大匹配

就是判断一下是不是每一个课程都能找到自己的代表人,做一遍最大匹配看看匹配数是否等于p即可 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cs

POJ2239_Selecting Courses(二分图最大匹配)

解题报告 http://blog.csdn.net/juncoder/article/details/38154699 题目传送门 题意: 每天有12节课.一周上7天,一门课在一周有多天上课. 求一周最多上几节课. 思路: 把课程看成一个集合,上课的时间看成一个集合,二分图就出来了. #include <cstdio> #include <cstring> #include <iostream> using namespace std; int n,day[10][15

HDU ACM 1083 Courses 二分图最大匹配

题意:p门课,每门课有若干学生,要为每门课分配一名课代表,每个学生只能担任一门课的课代表,若每个课都能找到课代表,则输出"YES",否则"NO". 分析:二分图的最大匹配,对课程.学生关系建立一个图,进行二分图最大匹配,当最大匹配数==课程数时说明能够满足要求,否则不能. #include<iostream> using namespace std; #define N 303 bool cs[N][N]; //cs[i][j]表示学生j是否选i这个课程

POJ2239 Selecting Courses【二分图最大匹配】

题目链接: http://poj.org/problem?id=2239 题目大意: 学校总共有N门课程,并且学校规定每天上12节可,一周上7天.给你每门课每周上的次数,和哪一天哪一节 课上的.如果有多门课程在同一天同一节课上,那么你只能选择其中一门.那么问题来了:最多能同时选多少 门课而不发生冲突呢. 输入说明: 先给你一个N,表示有N门课.接下来N行,每行第一个数字x,表示这门课每周上几节.接下来是x对数.第 一个数D表示是这一周哪一天上的,第二个数C表示是这一天哪一节课上的. 思路: 将这

POJ2239 Selecting Courses【二部图最大匹配】

主题链接: http://poj.org/problem?id=2239 题目大意: 学校总共同拥有N门课程,而且学校规定每天上12节可,一周上7天. 给你每门课每周上的次数,和哪一天哪一节 课上的.假设有多门课程在同一天同一节课上.那么你仅仅能选择当中一门.那么问题来了:最多能同一时候选多少 门课而不发生冲突呢. 输入说明: 先给你一个N.表示有N门课.接下来N行,每行第一个数字x,表示这门课每周上几节.接下来是x对数.第 一个数D表示是这一周哪一天上的,第二个数C表示是这一天哪一节课上的.

POJ 1469 COURSES (二分图最大匹配 匈牙利算法)

COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18892   Accepted: 7455 Description Consider a group of N students and P courses. Each student visits zero, one or more than one courses. Your task is to determine whether it is poss