poj 2239 Selecting Courses(二分匹配简单模板)
2015-09-16 17:04
381 查看
http://poj.org/problem?id=2239
这里要处理的是构图问题p (1 <= p <= 7), q (1 <= q <= 12)分别表示第i门课在一周的第p天的第q节课上
其中二分图的X集合里表示课程i,那么我们要解决的就是Y集合了
将第i门课在一周的第p天的第q节课上进行编号,这样Y集合就是
上课时间的编号了
这里要处理的是构图问题p (1 <= p <= 7), q (1 <= q <= 12)分别表示第i门课在一周的第p天的第q节课上
其中二分图的X集合里表示课程i,那么我们要解决的就是Y集合了
将第i门课在一周的第p天的第q节课上进行编号,这样Y集合就是
上课时间的编号了
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<queue> #include<algorithm> #define INF 0x3f3f3f3f #define N 310 using namespace std; int G , maps , vis , used ; int n, x; bool Find(int u) { int i; for(i = 1 ; i <= x ; i++) { if(!vis[i] && G[u][i]) { vis[i] = 1; if(!used[i] || Find(used[i])) { used[i] = u; return true; } } } return false; } int main() { int p, q, n, i, j, m; x = 1; memset(maps, 0, sizeof(maps)); for(i = 1 ; i <= 7 ; i++) { for(j = 1 ; j <= 12 ; j++) { maps[i][j] = x++; } }//构图 while(~scanf("%d", &n)) { memset(G, 0, sizeof(G)); for(i = 1 ; i <= n ; i++) { scanf("%d", &m); while(m--) { scanf("%d%d", &p, &q); G[i][maps[p][q]] = 1; } } memset(used, 0, sizeof(used)); int ans = 0; for(i = 1 ; i <= n ; i++) { memset(vis, 0, sizeof(vis)); if(Find(i)) ans++; } printf("%d\n", ans); } return 0; }
相关文章推荐
- 大数据笔记04:大数据之Hadoop的HDFS(基本概念)
- PHP网站开发语言技术
- mybaits调用存储过程
- jQuery和javascript获取临近节点方法
- java数字位数补全
- linux线程6(CSDN论坛上很火的一个讨论贴)
- jsp九大内置对象和四大作用域
- Phabricator命令行工具Arcanist的基本用法
- SpringMVC传参数一
- 基于HI3518E的wifi门铃方案
- Jpgraph error 13
- (转) 站在C#和JS的角度细谈函数式编程与闭包
- ios学习笔记(5)
- php基础篇:echo 与 print 的区别
- [转载] 高性能IO模型浅析
- 设计模式之装饰模式(iOS开发,代码用Objective-C展示)
- 利用ConfigParser读取配置文件
- APP运营推广|你所不知道的APP运营模型
- 如何新建rails项目
- 继承成员变量和函数的特点