博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2239 Selecting Courses【二部图最大匹配】
阅读量:6826 次
发布时间:2019-06-26

本文共 1607 字,大约阅读时间需要 5 分钟。

主题链接:

题目大意:

学校总共同拥有N门课程,而且学校规定每天上12节可,一周上7天。

给你每门课每周上的次数,和哪一天哪一节

上的。假设有多门课程在同一天同一节课上。那么你仅仅能选择当中一门。那么问题来了:最多能同一时候选多少

门课而不发生冲突呢。

输入说明:

先给你一个N。表示有N门课。接下来N行,每行第一个数字x,表示这门课每周上几节。接下来是x对数。第

一个数D表示是这一周哪一天上的,第二个数C表示是这一天哪一节课上的。

思路:

将这道题来看做二分图匹配问题。

建立一个二分图,一边代表课程,一边代表某一节课(将一周7*12节课按

1~7*12来排列)。将课程和该课程上的某一节课相应建边,再求这个二分图的最大匹配数就可以。这里用匈牙

利DFS版来做。

AC代码:

#include
#include
#include
#include
using namespace std;const int MAXN = 330;int Map[MAXN][MAXN];int Mask[MAXN];int N,M;int cx[MAXN],cy[MAXN];int FindPath(int u){ for(int i = 1; i <= M; ++i) { if(Map[u][i] && !Mask[i]) { Mask[i] = 1; if(cy[i] == -1 || FindPath(cy[i])) { cy[i] = u; cx[u] = i; return 1; } } } return 0;}int MaxMatch(){ int res = 0; for(int i = 1; i <= N; ++i) cx[i] = -1; for(int i = 1; i <= M; ++i) cy[i] = -1; for(int i = 1; i <= N; ++i) { if(cx[i] == -1) { for(int j = 1; j <= M; ++j) Mask[j] = 0; res += FindPath(i); } } return res;}int main(){ int a,b,id; while(~scanf("%d",&N)) { memset(Map,false,sizeof(Map)); M = 7*12; for(int i = 1; i <= N; ++i) { scanf("%d",&id); for(int j = 1; j <= id; ++j) { scanf("%d%d",&a,&b); Map[i][(a-1)*12+b] = 1; } } printf("%d\n",MaxMatch()); } return 0;}

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
[NGX]Angular组件/指令生命周期简介
查看>>
剑指offer刷题指南
查看>>
详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)
查看>>
《2018双11医美城市消费榜单》:医美将在二三线城市大爆发
查看>>
正在经历寒冬的无印良品,春天在哪里?
查看>>
Scrapy框架的使用之Scrapyrt的使用
查看>>
OkHttpClient 源码分析 2(基于3.9.0的源码)
查看>>
如何写一个无配置格式统一的日志
查看>>
tsconfig.json整理记录
查看>>
adb通信协议分析以及实现(四):adb shell 命令分析
查看>>
日常工作中,个人总结的 - Git - 常用操作方法 (一)
查看>>
面试中被面试官问到的问题答案(一)
查看>>
使用属性Props完成一张卡片
查看>>
49. Group Anagrams
查看>>
TypeScript实现数据结构(一)栈,队列,链表
查看>>
IOS评论框不贴底(ios12新bug)
查看>>
26. Remove Duplicates from Sorted Array
查看>>
Jenkins in Action :GitLab 部署 Maven 项目
查看>>
从0开始构建SpringCloud微服务(1)
查看>>
Linux Shell 生成随机数和随机字符串
查看>>