P2763 试题库问题
admin
2024-01-29 12:52:51
0

题目链接:P2763 试题库问题

题意

一个试题库中有 nnn 道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取 mmm 道题组成试卷。并要求试卷包含指定类型的试题的试题数量要达标。试设计一个满足要求的组卷算法。每道题选出来以后就只能算作一种类型了。

解析

匹配问题之二,一对多的的匹配问题,建图跑网络流。

每道题目可以看做与题的类型配对,每种类型的题有数目的要求。最终我们要选出题目,于是我们考虑将所有题目作为多源汇流向最终的汇点。

n+k+1n + k + 1n+k+1号:源点
n+1n + 1n+1 ~ n+kn + kn+k:代表题目的类型
111 ~nnn:代表nnn道题目
000号:汇点
1.1.1.每道题有多种类型,但最终选出来只能算作一种类型,那么其贡献流向的汇点流量应该为111。
2.2.2.每个题只能只能算作一个题型, 所以 题型 到有 相应题型的题目 的流量为111。
3.3.3.每种题目类型需要cnt道题,所以与源点连边的流量为cntcntcnt。

最终流到汇点的流量大于等于mmm就是可行的
注意边的数量并不算很小,博主自己估算为500050005000还RE了一发,最终开到100001000010000才过。

代码

#include 
#include 
#include 
#include 
using namespace std;
const int N = 2000, M =  10000;
struct edge{int to,nex,w;
}e[M];
int head[N], n, k, m, tot = 1;void add(int to,int from,int w){e[++ tot].w = w;e[tot].to = to;e[tot].nex = head[from];head[from] = tot;
}int dep[N];
bool bfs()
{for(int i = 0; i <= n + k + 1; i ++) dep[i] = 0;dep[n + k + 1] = 1;queueq;q.push(n + k + 1);while(!q.empty()){int u = q.front(); q.pop();for(int i = head[u]; i; i = e[i].nex){int v = e[i].to;if(e[i].w && !dep[v]){dep[v] = dep[u] + 1;if(v == 0) return true;q.push(v);}}}return dep[0];
}int dfs(int u,int inflow){if(u == 0)return inflow;int outflow = 0;for(int i = head[u]; i; i = e[i].nex){int v = e[i].to;if(e[i].w && dep[v] == dep[u] + 1){int flow = dfs(v, min(e[i].w, inflow));e[i].w -= flow;e[i ^ 1].w += flow;inflow -= flow;outflow += flow;}}if(!outflow) dep[u] = 0;return outflow;
}int main()
{ios::sync_with_stdio(false);cout.tie(NULL);cin >> k >> n;// 设0为汇点for(int i = 1; i <= n; i ++){ // 每道题有多种题目类型,但最终只能算作一种,所以每道题到汇点的流量为1add(0, i, 1);add(i, 0, 0);}for(int i = 1; i <= k; i ++){// 设n + k + 1为源点int cnt;cin >> cnt;m += cnt;add(i + n, n + k + 1, cnt);add(n + k + 1, i + n, 0);//需要cnt个,所以与源点连边的流量为cnt}for(int i = 1; i <= n; i ++){int num, x;cin >> num;while(num --){cin >> x; //每个题只能只能算作一个题型, 所以到每道题的流量为1add(i, n + x, 1);add(n + x, i, 0); }}int ans = 0;while(bfs()){ans += dfs(n + k + 1, 10000);}if(ans < m){cout << "No Solution!\n";return 0;}vector res;for(int i = n + 1; i <= n + k; i ++){res.clear();for(int j = head[i]; j; j = e[j].nex){if(e[j].to <= n && e[j].w == 0) res.push_back(e[j].to);}cout << i - n << ": ";for(int x : res){cout << x << " ";}cout << "\n";}return 0;
}

相关内容

热门资讯

直击老百姓股东大会,谢子龙:面... 【大河财立方 记者 王鑫 长沙报道】6月18日下午,老百姓大药房连锁股份有限公司(以下简称“老百姓”...
外资集体唱多,岂是短期利好这么... 放下一周的交易疲惫,静下心,理性总结行情与问题。本篇为大家准备了4条要闻,覆盖当前市场核心动向,帮大...
原创 “... 老铁们,今天这盘面,不用看K线,看评论区就够了。 创业板、科创一举冲高,刷新阶段强势区间;上证这边却...
2026中国快消自有品牌价值进... 今天分享的是:2026中国快消自有品牌价值进阶之路研究报告-尼尔森IQ 报告共计:12页 这份尼尔森...
原创 秦... 兵马俑的全称应为秦始皇兵马俑,这一举世震惊的考古奇迹首次被发现于1974年,自那以后,它便成为中华文...
原创 反... 大家好,我是小毋。 一场看似针对性极强的产业链博弈,在今年的G7峰会上正式摆上台面。 一众西方发达国...
局势突变!刚刚,全线跳水!股市... 美伊谈判的变数搅动金融市场。 今日(6月19日)午间,日韩股市全线跳水,韩国KOSPI指数一度跌超2...
国际金价失守4200美元关口 图片来源:视觉中国 6月19日,国际黄金市场持续走弱,现货黄金价格盘中加速跳水,一举跌破4200美元...
装载8000万桶原油的超级油轮... 6月19日,财闻海外资讯消息,载有近8000万桶石油的超级油轮正停泊在波斯湾,一旦交易商和船东发出指...
原创 刚... 法国总统马克龙最近的状态,用一句哭笑不得来形容再贴切不过。原本他一门心思准备在对华贸易议题上做文章,...
惠誉:将宁德时代的发行人主体评... 6月18日,惠誉国际评级有限公司(下称“惠誉”)上调宁德时代(300750.SZ/03750.HK)...
临商银行“临商红”青年志愿服务... 为大力弘扬践行沂蒙精神,临商银行联合市委金融工委、市委市直机关工委、共青团临沂市委共同打造了“临商红...
SpaceX 上市:SPCX ... EBC Financial Group 自开盘起即向全球交易者提供双向交易通道,参与这一史上最大规模...
甘肃电气集团长开公司荣获202... 近日,在2026年度中国中压电器行业权威评选活动中,甘肃电气集团长开公司荣获中国中压电器市场“卓越贡...
是80%的工位面向海景,马岩松... 腾讯总部园区 摄影:张超 深圳大铲湾,腾讯总部园区“企鹅岛”于5月底首次面向公众开放。 三座由马岩松...
日本经济专家:加息难以扭转日元... 日本央行近日宣布将政策利率自0.75%上调至1.0%,为31年来最高水平。日本经济专家认为,目前日元...
黄金跌2%失守4130美元,白... 6月19日午间,黄金白银仍未止跌。截至13时,现货黄金跌2%,报4124.57美元/盎司,失守413...
原创 中... 2026年6月这个节点意味格外不同。4月伊朗与以色列那场脆弱的停火刚撑了不到两个月,6月8日两边又对...
Manus回购方案浮出水面:中... 文 | 强调Next 据外媒The Information6月18日报道,Manus的早期中国投资...
2026黄金回收避坑,郑州72... 来源:黄冈新闻网 一、郑州黄金回收市场现状与高价引流投诉占比 据郑州市 12315 消费维权平台 2...