luogu2763 试题库问题 二分匹配
关键词:二分匹配
本题用有上下界的网络流可以解决,但编程复杂度有些高。
每个类需要多少题,就设置多少个类节点。每个题节点向其所属的每一个类节点连一条边。这样就转化成了二分匹配问题。
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cassert>
using namespace std; #define LOOP(i,n) for(int i=1; i<=n; i++)
const int MAX_X = , MAX_Y = , MAX_EDGE = MAX_X*MAX_Y; struct Hungary
{
struct Xnode;
struct Ynode;
struct Edge; struct Xnode
{
Edge *Head;
int Id;
}_xNodes[MAX_X];
int _xCnt; struct Ynode
{
Xnode *Match;
bool Vis;
Ynode():Vis(false){}
}_yNodes[MAX_Y];
int _yCnt; struct Edge
{
Xnode *X;
Ynode *Y;
Edge *Next;
Edge(Xnode *x, Ynode *y, Edge *next):X(x),Y(y),Next(next){}
}*_edges[MAX_EDGE];
int _eCnt; void Init(int xCnt, int yCnt)
{
_xCnt = xCnt;
_yCnt = yCnt;
_eCnt = ;
} void Build(int xId, int yId)
{
//printf("xId %d yId %d\n", xId, yId);
Xnode *x = xId + _xNodes;
Ynode *y = yId + _yNodes;
x->Id = xId;
Edge *e = _edges[++_eCnt] = new Edge(x, y, x->Head);
x->Head = e;
} bool Dfs(Xnode *x)
{
for (Edge *e = x->Head; e; e = e->Next)
{
if (!e->Y->Vis)
{
e->Y->Vis = true;
if (!e->Y->Match || Dfs(e->Y->Match))
{
e->Y->Match = x;
return true;
}
}
}
return false;
} int GetMatchCnt()
{
int ans = ;
LOOP(xId, _xCnt)
{
LOOP(yId, _yCnt)
_yNodes[yId].Vis = false;
ans += Dfs(xId + _xNodes);
}
return ans;
}
}g; int main()
{
#ifdef _DEBUG
freopen("c:\\noi\\source\\input.txt", "r", stdin);
#endif
int totSort, totQuest, sortNeedCnt[MAX_X], sortPrevCnt[MAX_Y], yCnt = , matchCnt;
memset(sortPrevCnt, , sizeof(sortPrevCnt));
memset(sortNeedCnt, , sizeof(sortNeedCnt));
scanf("%d%d", &totSort, &totQuest);
LOOP(i, totSort)
{
scanf("%d", i + sortNeedCnt);
sortPrevCnt[i + ] = (yCnt += sortNeedCnt[i]);
}
g.Init(totQuest, yCnt);
LOOP(xId, totQuest)
{
int sortInCnt;
scanf("%d", &sortInCnt);
LOOP(i, sortInCnt)
{
int sortIn;
scanf("%d", &sortIn);
LOOP(j, sortNeedCnt[sortIn])
g.Build(xId, j + sortPrevCnt[sortIn]);
}
}
matchCnt = g.GetMatchCnt();
if (matchCnt < yCnt)
{
printf("No Solution!\n");
return ;
}
LOOP(curSort, totSort)
{
printf("%d: ", curSort);
for (int yId = sortPrevCnt[curSort] + ; yId <= sortPrevCnt[curSort] + sortNeedCnt[curSort]; yId++)
printf("%d ", g._yNodes[yId].Match->Id);
printf("\n");
}
return ;
}
luogu2763 试题库问题 二分匹配的更多相关文章
- luogu2763 试题库问题
倘若某个试题已经被选到某个类型里了,那么它就不可再被选进别的类型了. 所以,对于每个类型,我们将其与汇连边,权值是它的要求的题目数量. 对于每个题目,我们将源与其连边,权值是1,代表只能用一次.然后再 ...
- 【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)
[题意] 假设一个试题库中有 n 道试题. 每道试题都标明了所属类别. 同一道题可能有多个类别属性.现要从题库中抽取 m 道题组成试卷.并要求试卷包含指定类型的试题. 试设计一个满足要求的组卷算法. ...
- 洛谷 P2763 试题库问题(网络流24题之一)
题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...
- COGS732. [网络流24题] 试题库
«问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...
- POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24081 Accepted: 106 ...
- [kuangbin带你飞]专题十 匹配问题 二分匹配部分
刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...
- 一个面试题的解答-----从500(Id不连续)道试题库里随机抽取20道题!
做一个考试系统的项目,现在从试题库里面随机抽取20道题 比如我题库有500道题(ID不连续).题目出现了,如何解决呢,随机抽取! 1,我们先把500道题的id存进一个长度为500的数组. 2,实现代码 ...
- BZOJ 1189 二分匹配 || 最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1155 Solved: 420[Submi ...
- Kingdom of Obsession---hdu5943(二分匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:给你两个数n, s 然后让你判断是否存在(s+1, s+2, s+3, ... , s+n ...
随机推荐
- 简单的KKL诊断线~~~自己在家都可以制作obd诊断接口了 ~~
简单的KKL诊断线~~~自己在家都可以制作~~ 适合bmw 07年以前的车型,因为新的车型使用D-can作为诊断接口,所以不能再使用kkl诊断接口不过SB开头的宝马3系还是可以使用的 更多内容欢迎查看 ...
- [转]【C/C++】Linux下使用system()函数一定要谨慎
曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...
- JS——鼠标在盒子中的坐标
核心思想: 1.复杂版本:鼠标pageX.pageY的值减去盒子距离顶端的offsetLeft.offsetTop值就是鼠标在盒子中的坐标 2.简单版本:offsetX.offsetY就可获取鼠标相对 ...
- Vue项目在IE浏览器报错polyfill-eventsource added missing EventSource to window
已经安装了babel-polyfill,依然报错.
- 如何用windbg查看_eprocess结构
打开菜单: File->Symbol File Path... 输入: C:/MyCodesSymbols; SRV*C:/MyLocalSymbols*http://msdl.microsof ...
- centOS Linux下用yum安装mysql
centOS Linux下用yum安装mysql 第一篇:安装和配置MySQL 第一步:安装MySQL [root@192 local]# yum -y install mysql- ...
- Java面向对象多态
Java面向对象多态 7.2对象 7.2.1创建对象 对象是类的实例 类的名称 对象名称 = new 类的名称(); 7.3继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域 ...
- loader__demo_css
环境 node + yarn + webpack4.0 + webpack-cli + style-loader css-loader 文件结构 │ package.json │ webpack.co ...
- Java 内存模型与线程
when ? why ? how ? what ? 计算机的运行速度和它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O .网络通信或者数据库访问上.如何把处理器的运算能力"压 ...
- Flask-SQLAlchemy中解决1366报错
会报下面这个1366的错 安装MySQL驱动(我升级过Python,所以要再装一遍) 本想安装MySQL官方驱动mysql-connector-python的,然而官方目前只支持到3.4 我又懒,所以 ...