[返回网络流 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. 实战限流(guava的RateLimiter)

    关于限流 常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌 ...

  2. ubuntu16.04查看opencv版本

    查看opencv版本:pkg-config opencv --modversion

  3. APP自动化测试的环境配置

    什么是Appium? 第三方自动化框架(工具),扩充了selenium webdriver 协议,在原有的基础上添加了移动端测试API selenium webdriver 指定了客户端到服务端的协议 ...

  4. gym102346题解

    B Buffoon 判断最大值是不是第一个数,签到题. H Hour for a Run 输出\(n*m\)的\(10\%\)到\(90\%\),签到题,注意别用浮点数和ceil,有精度问题. M M ...

  5. Centos安装PhantomJS

    1.下载PhantomJS [root@liuge ~]# wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-l ...

  6. python的元组存储的实质和多元赋值

    python中有一种赋值机制即多元赋值,采用这种方式赋值时,等号两边的对象都是元组并且元组的小括号是可选的.通常形式为 x, y, z = 1, 2, 'a string' 等同于 (x, y, z) ...

  7. java多线程技术核心

    1.进程的三大特征: 独立性:拥有自己的独立的地址空间,一个进程不可以直接去访问其他进程的地址空间. 动态性:是一个系统中活动的指令的集合. 并发性:单个进程可以在多个处理器上并发进行,互不影响. 2 ...

  8. MYSQL-用户密码修改

    解决方法如下:1.终端中结束当前正在运行的mysql进程.# sudo /etc/init.d/mysql stop2.用mysql安全模式运行并跳过权限验证.# sudo /usr/bin/mysq ...

  9. git 查看日志记录

    1.git log 如果日志特别多的话,在git bash中,按向下键来查看更多,按q键退出查看日志. 2.git show 查看最近一次commit内容,也可以后面加commit号,单独查看此次版本 ...

  10. Django基础五之django模型层之关联管理器

    class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: ForeignKey关系的“另一边”.像这样: 1 ...