关键词:二分匹配

本题用有上下界的网络流可以解决,但编程复杂度有些高。

每个类需要多少题,就设置多少个类节点。每个题节点向其所属的每一个类节点连一条边。这样就转化成了二分匹配问题。

#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 试题库问题 二分匹配的更多相关文章

  1. luogu2763 试题库问题

    倘若某个试题已经被选到某个类型里了,那么它就不可再被选进别的类型了. 所以,对于每个类型,我们将其与汇连边,权值是它的要求的题目数量. 对于每个题目,我们将源与其连边,权值是1,代表只能用一次.然后再 ...

  2. 【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

    [题意] 假设一个试题库中有 n 道试题. 每道试题都标明了所属类别. 同一道题可能有多个类别属性.现要从题库中抽取 m 道题组成试卷.并要求试卷包含指定类型的试题. 试设计一个满足要求的组卷算法. ...

  3. 洛谷 P2763 试题库问题(网络流24题之一)

    题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...

  4. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  5. POJ 1274 The Perfect Stall、HDU 2063 过山车(最大流做二分匹配)

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24081   Accepted: 106 ...

  6. [kuangbin带你飞]专题十 匹配问题 二分匹配部分

    刚回到家 开了二分匹配专题 手握xyl模板 奋力写写写 终于写完了一群模板题 A hdu1045 对这个图进行 行列的重写 给每个位置赋予新的行列 使不能相互打到的位置 拥有不同的行与列 然后左行右列 ...

  7. 一个面试题的解答-----从500(Id不连续)道试题库里随机抽取20道题!

    做一个考试系统的项目,现在从试题库里面随机抽取20道题 比如我题库有500道题(ID不连续).题目出现了,如何解决呢,随机抽取! 1,我们先把500道题的id存进一个长度为500的数组. 2,实现代码 ...

  8. BZOJ 1189 二分匹配 || 最大流

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1155  Solved: 420[Submi ...

  9. Kingdom of Obsession---hdu5943(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5943 题意:给你两个数n, s 然后让你判断是否存在(s+1, s+2, s+3, ... , s+n ...

随机推荐

  1. bootstrap 字体颜色 对齐方式

    一:字体代码:作用--颜色 1..text-muted:提示--浅灰色 2..text-primary:主要--蓝色 3..text-success:成功--浅绿色 4..text-info:     ...

  2. IE9的F12工具,"网络"页签,点击"开始捕获"之后,请求显示的状态是"挂起"的分析和解决

    最近一个项目,客户端使用用jQuery编写ajax请求,服务端采用struts2框架.js发送请求和action处理请求过程中,遇到一个问题.刚开始觉得问题很诡异,仔细定位很久之后才发现问题,虽然问题 ...

  3. Zynq7000系列之芯片系统结构概述

    相比较经典的FPGA,Zynq7000系列最大的特点是将处理系统PS和可编程资源PL分离开来,固化了PS系统的存在,实现了真正意义上的SOC(System On Chip). 1.  Zynq7000 ...

  4. 文件下载之ServletOutputStream

    使用response.getOutputStream可以获取ServletOutputStream,从而实现向页面发送流数据.但是需要注意的是,不能使用ajax进行请求,因为这样页面不会有任何反应,可 ...

  5. Lazarus Reading XML- with TXMLDocument and TXPathVariable

    也就是使用XPath的方式,具体语法规则查看http://www.w3school.com.cn/xpath/xpath_syntax.asp,说明得相当详细.这里列举例子是说明在Lazarus/FP ...

  6. Centos6.4 安装bind dns 服务器

    一.介绍 1)Centos6.4 64bit minimal 2) bind-9.8.2-0.30.rc1.el6_6.3.x86_64 二.安装 $ yum install -y bind bind ...

  7. python笔记之发送邮件

    发送邮件前提:开启邮箱授权码 一.开启授权码(以163邮箱为例) 1.登录163邮箱,点击设置--POP3/SMTP/IMAP,出现设置界面   2. 开启SMTP服务且可以查询SMTP的host地址 ...

  8. CAD在网页中如何得到用户自定义事件的参数?

    主要用到函数说明: _DMxDrawX::CustomEventParam 得到用户自定义事件的参数. js代码实现如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  9. TypeError: CleanWebpackPlugin is not a constructor

    在项目中引入clean-webpack-plugin打包后报错 new CleanWebpackPlugin(), ^ TypeError: CleanWebpackPlugin is not a c ...

  10. Contest Round #451 (Div. 2)F/Problemset 898F Restoring the Expression

    题意: 有一个a+b=c的等式,去掉两个符号,把三个数连在一起得到一个数 给出这个数,要求还原等式,length <= 1e6 三个数不能含有前导0,保证有解 解法: 铁头过题法,分类然后各种判 ...