[返回网络流 24 题索引]

题目描述

假设一个试题库中有 nnn 道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取 mmm 道题组成试卷。并要求试卷包含指定类型的试题。

Solution 2763\text{Solution 2763}Solution 2763

设表示题目的点为 PPP,表示类别的为 KKK。

首先从源 STSTST 到 PiP_iPi​ 连一条流量为 111 的边,即每道题只能选一次;

然后从 KiK_iKi​ 到 EDEDED 连一条流量为 aia_iai​ 的边,即每种类型需要选 aia_iai​ 道;

最后 ∀j∈Ti\forall j \in T_i∀j∈Ti​,从 PiP_iPi​ 给 KjK_jKj​ 连边,即每道题可以以相应类型的名义被选出。

方案即是所有 题目到类型 的连边中满流的那些。如果流量不满则无解。

附上 dalao ⚡cdecl⚡ 的代码。

#include <cstdio>
#include <cstring>
#include <queue> const int N = 1e3 + 31, M = 3e4 + 43, K = 22, INF = 0x3f3f3f3f; struct edge {
int to, next, w;
} e[M << 1];
int head[N], cnt = 1;
void addedge(int x, int y, int z) {
e[++cnt] = (edge){y, head[x], z};
head[x] = cnt;
e[++cnt] = (edge){x, head[y], 0};
head[y] = cnt;
} int level[N];
bool bfs(int s, int t) {
memset(level, 0, sizeof level);
std::queue<int> q;
q.push(s);
level[s] = 1;
while (!q.empty()) {
int pos = q.front();
q.pop();
for (int i = head[pos]; i; i = e[i].next) {
int nx = e[i].to;
if (level[nx] || !e[i].w) continue;
level[nx] = level[pos] + 1;
q.push(nx);
}
}
return level[t];
} int dfs(int s, int t, int flow) {
if (s == t) return flow;
int ret = 0;
for (int i = head[s]; flow && i; i = e[i].next) {
int nx = e[i].to;
if (level[s] + 1 == level[nx] && e[i].w) {
int tmp = dfs(nx, t, std::min(flow, e[i].w));
e[i].w -= tmp;
e[i ^ 1].w += tmp;
ret += tmp;
flow -= tmp;
}
}
return ret;
} int dinic(int s, int t) {
int ret = 0;
while (bfs(s, t)) ret += dfs(s, t, INF);
return ret;
} std::queue<int> out[K];
int n, k, x, y, sum;
int main() {
scanf("%d%d", &k, &n);
for (int i = 1; i <= k; i++) {
scanf("%d", &x);
addedge(n + i + 1, n + k + 2, x);
sum += x;
}
for (int i = 1; i <= n; i++) {
addedge(1, i + 1, 1);
for (scanf("%d", &x); x--;) {
scanf("%d", &y);
addedge(i + 1, n + y + 1, 1);
}
}
if (dinic(1, n + k + 2) != sum) return puts("No Solution!"), 0;
for (int i = 1; i <= n; i++) {
for (int j = head[i + 1]; j; j = e[j].next) {
if ((~j & 1) && !e[j].w) {
out[e[j].to - n - 1].push(i);
break;
}
}
}
for (int i = 1; i <= k; i++) {
printf("%d: ", i);
if (out[i].empty()) puts("");
while (!out[i].empty()) {
printf("%d%c", out[i].front(), " \n"[out[i].size() == 1]);
out[i].pop();
}
}
}

[网络流 24 题] luoguP2763 试题库问题的更多相关文章

  1. Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)

    Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...

  2. liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案

    #6006. 「网络流 24 题」试题库     题目描述 假设一个试题库中有 n nn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 m mm 道题组成试卷.并要求 ...

  3. 【刷题】LOJ 6006 「网络流 24 题」试题库

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

  4. 【PowerOJ1742&网络流24题】试题库问题(最大流)

    题意: 思路: [问题分析] 二分图多重匹配问题,用最大流解决. [建模方法] 建立二分图,每个类别为X集合中的顶点,每个题为Y集合中的顶点,增设附加源S和汇T. 1.从S向每个Xi连接一条容量为该类 ...

  5. Cogs 732. [网络流24题] 试题库(二分图)

    [网络流24题] 试题库 ★★ 输入文件:testlib.in 输出文件:testlib.out 评测插件 时间限制:1 s 内存限制:128 MB «问题描述: 假设一个试题库中有n道试题.每道试题 ...

  6. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

  7. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  8. 网络流基础&网络流24题

    网络最大流 dinic+当前弧优化. const int N=10007,M=100007,inf=1e9; int s,t,head[N],ver[M],edge[M],Next[M],tot=1, ...

  9. [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划

    [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...

随机推荐

  1. ADC0832

    #include <reg51.h> #include "ADC0832.c" code uchar seven_seg[]={0xc0, 0xf9, 0xa4, 0x ...

  2. 表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数

    目录 表达式树练习实践:C#值类型.引用类型.泛型.集合.调用函数 一,定义变量 二,访问变量/类型的属性字段和方法 1. 访问属性 2. 调用函数 三,实例化引用类型 四,实例化泛型类型于调用 五, ...

  3. 可能是 Python 中最火的第三方开源测试框架 pytest

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  4. [DE] How to learn Big Data

    打开一瞧:50G的文件! emptystacks jobstacks jobtickets stackrequests worker 大数据加数据分析,需要以python+scikit,sql作为基础 ...

  5. C++基础之迭代器

    迭代器的分类 插入迭代器(insert iterator):绑定一个容器上后可以向容器中插入元素: 流迭代器(stream iterator):绑定在输入输出流中,可以遍历关联的流: 反向迭代器(re ...

  6. vue报错:[Vue warn]: Do not use built-in or reserved HTML elements as component id: header

    报错的信息大致是不要将内置或保留的HTML元素用作组件ID 解决的办法是修改name符合规范或者直接删除组件内的name属性.

  7. 从零开始入门 K8s | 应用编排与管理:Job & DaemonSet

    一.Job 需求来源 Job 背景问题 首先我们来看一下 Job 的需求来源.我们知道 K8s 里面,最小的调度单元是 Pod,我们可以直接通过 Pod 来运行任务进程.这样做将会产生以下几种问题: ...

  8. Scrapy项目 - 实现豆瓣 Top250 电影信息爬取的爬虫设计

    通过使Scrapy框架,掌握如何使用Twisted异步网络框架来处理网络通讯的问题,进行数据挖掘和对web站点页面提取结构化数据,可以加快我们的下载速度,也可深入接触各种中间件接口,灵活的完成各种需求 ...

  9. Spring Boot Thymeleaf 实现国际化

    开发传统Java WEB工程时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用了.SpringBoot支持如下页面模板语言 Thymeleaf FreeMarker Vel ...

  10. mysql 最左前缀匹配原则

    1.在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:对列col1.列col2和列col3建一个联合索引 KEY index_col1_co ...