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 ...
随机推荐
- 研磨JavaScript系列(三):函数的魔力
JavaScript的代码中就只有function一种形式,function就是函数的类型.在其他的编程语言中可能还存在Procedure或者是method等代码概念,在JavaScript中只有fu ...
- 前端-Node.js思维导图笔记
看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记
- OpenCV绘制检测结果
OpenCV绘制检测结果 opencv rtcp timestamp 一.介绍 由于在验证阶段,使用FPGA时我们的算法检测速度很慢,没法直接在主流上进行绘图,否则的话,主流就要等待算法很久才能 ...
- hibernate 级联删除报更新失败的问题(org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update)
首先hibernate级联删除的前提是,首先需要在映射文件中配置,配置多表之间的关联关系: 下面以部门表(Dept)和员工表(Emp)为例: 1.在Emp.hbm.xml映射文件中配置many-to- ...
- html5——动画案例(无缝滚动)
无缝滚动:是两组拼在一起的 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- [Windows Server 2012] 杰奇CMS安全设置
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:JIEQI ...
- 【sqli-labs】 less54 GET -Challenge -Union -10 queries allowed -Variation1 (GET型 挑战 联合查询 只允许10次查询 变化1)
尝试的次数只有10次 http://192.168.136.128/sqli-labs-master/Less-54/index.php?id=1' 单引号报错,错误信息没有显示 加注释符页面恢复正常 ...
- vC web管理无法访问解决办法
localhost:~ # service-control --status vsphere-clientINFO:root:Service: vsphere-client, Action: stat ...
- enote笔记语言(4)(ver0.3)——“5w1h2k”分析法
章节:“5w1h2k”分析法 what:我想知道某个“关键词(keyword)”(即,词汇.词语,或称单词,可以是概念|专业术语|.......)的定义. why:我想知道事物发生的原因.“why ...
- uva-679 Dropping Balls UVA - 679
题目大意 总共有一个深度为D的满二叉树,I个小球,每个节点具有开关,小球经过节点后节点开关会有变化,初始都关闭,若关闭往左右否则往右走 只需要循环一下每层的情况即可 代码 #include <b ...