[网络流 24 题] luoguP2763 试题库问题
题目描述
假设一个试题库中有 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 试题库问题的更多相关文章
- Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)
Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...
- liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案
#6006. 「网络流 24 题」试题库 题目描述 假设一个试题库中有 n nn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 m mm 道题组成试卷.并要求 ...
- 【刷题】LOJ 6006 「网络流 24 题」试题库
题目描述 假设一个试题库中有 \(n\) 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 \(m\) 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组 ...
- 【PowerOJ1742&网络流24题】试题库问题(最大流)
题意: 思路: [问题分析] 二分图多重匹配问题,用最大流解决. [建模方法] 建立二分图,每个类别为X集合中的顶点,每个题为Y集合中的顶点,增设附加源S和汇T. 1.从S向每个Xi连接一条容量为该类 ...
- Cogs 732. [网络流24题] 试题库(二分图)
[网络流24题] 试题库 ★★ 输入文件:testlib.in 输出文件:testlib.out 评测插件 时间限制:1 s 内存限制:128 MB «问题描述: 假设一个试题库中有n道试题.每道试题 ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
- 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)
------------------------------------------------------------------------------------ 17/24 --------- ...
- 网络流基础&网络流24题
网络最大流 dinic+当前弧优化. const int N=10007,M=100007,inf=1e9; int s,t,head[N],ver[M],edge[M],Next[M],tot=1, ...
- [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划
[luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...
随机推荐
- 表达式树练习实践:C# 五类运算符的表达式树表达
目录 表达式树练习实践:C# 运算符 一,算术运算符 + 与 Add() - 与 Subtract() 乘除.取模 自增自减 二,关系运算符 ==.!=.>.<.>=.<= 三 ...
- 3.1、双向循环链表(java实现)
1.创建节点类 public class CNode<T> { public CNode prev; public CNode next; public T data; public CN ...
- eos bp节点 超级节点搭建
搭建eos BP节点 环境搭建与配置 安装最新版本 $ wget https://github.com/eosio/eos/releases/download/v1.8.1/eosio-1 ...
- JavaEE就业学习路线(给初学者以及自学者一个学习方向)
大家按这个路线学完后基本可以找工作了 第一节java入门 1-Java 背景介绍 2-Java 入门程序的编写 3-环境配置 4-基本概念介绍 5-类型转换 6-开发工具使用 第二节java基础 1- ...
- ubuntu16.04查看opencv版本
查看opencv版本:pkg-config opencv --modversion
- spring boot 整合mybatis 的xml版本【包括逆向工程以及分页插件】
逆向工程很方便,可以直接根据数据库和配置文件生成pojo,mapper接口和相应的映射文件. xml版本和全注解版本其实差不多,大部分情况下,都会保留xml文件方便其他人去扩展新的dml方法. 文章旨 ...
- js屏蔽地区
其实不需要后台代码也可以获取地区信息的,就算是后台代码,也得需要引用一些第三方库提供免费的api接口才可以,最后还是反序列化才能得到想要的数据,那干嘛不直接找,提供好json格式的api接口,拿来js ...
- [Advanced Python] 16 - Google style guide for programming
Ref: Python 风格指南 - 内容目录 这里主要记录一下值得注意的地方. Python语言规范 Lint:vsCode自带 导入:完整路径 异常 Ref: [Python] 07 - Stat ...
- Windows导出文件夹中的文件名列表
在需要导出的目录中,shift+右键,打开cmd或者powershell 运行命令:dir -name >list.txt 刷新文件夹,打开list.txt
- JDK 自带的性能监控工具
JDK安装完后,其内置了许多的监控工具,常用的有jvisualvm,jconsole,jps,jmap,jinfo,jstat,jstack,这些命令都在jdk安装的bin目录下: 1.jvisual ...