liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案
#6006. 「网络流 24 题」试题库
题目描述
假设一个试题库中有 n nn 道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取 m mm 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算法。
输入格式
第 1 11 行有 2 22 个正整数 k kk 和 n nn。k kk 表示题库中试题类型总数,n nn 表示题库中试题总数。第 2 22 行有 k kk 个正整数,第 i ii 个正整数表示要选出的类型 i ii 的题数。这 k kk 个数相加就是要选出的总题数 m mm。
接下来的 n nn 行给出了题库中每个试题的类型信息。每行的第 1 11 个正整数 p pp 表明该题可以属于 p pp 类,接着的 p pp 个数是该题所属的类型号。
输出格式
第 i ii 行输出 i: 后接类型 i ii 的题号。如果有多个满足要求的方案,只要输出一个方案。如果问题无解,则输出 No Solution!。
样例
样例输入
3 15
3 3 4
2 1 2
1 3
1 3
1 3
1 3
3 1 2 3
2 2 3
2 1 3
1 2
1 2
2 1 2
2 1 3
2 1 2
1 1
3 1 2 3
样例输出
1: 1 6 8
2: 7 9 10
3: 2 3 4 5
数据范围与提示
2≤k≤20,k≤n≤1000 2 \leq k \leq 20, k \leq n \leq 10002≤k≤20,k≤n≤1000
题解:
wannafly题解
建立二分图,每个类别为X集合中的顶点,每个题为Y集合中的顶点,增设附加源S和汇T。
1、从S向每个Xi连接一条容量为该类别所需数量的有向边。
2、从每个Yi向T连接一条容量为1的有向边。
3、如果一个题i属于一个类别j,连接一条从Xj到Yi容量为1的有向边。
求网络最大流,如果最大流量等于所有类别所需之和,则存在解,否则无解。对于每个类别,从X集合对应点出发的所有满流边,指向的B集合中的顶点就是该类别的所选的题(一个可行解)。
#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,double>
#define MP make_pair
typedef long long LL;
typedef unsigned long long ULL;
const long long INF = 1e18+1LL;
const double pi = acos(-1.0);
const int N = 1e5+, M = 1e3+,inf = 2e9; int head[N],t=,h[N],q[N],S,T,ans = ;
struct edge{int to,next,v;}e[N * ];
void adds(int u,int v,int w)
{e[t].to=v;e[t].v=w;e[t].next=head[u];head[u]=t++;}
void add(int u,int v,int w) {adds(u,v,w);adds(v,u,);}
int bfs() {
memset(h,-,sizeof(h));
int l=,r=,now;
q[l]=S;
h[S]=;
while(l!=r){
now=q[l++];if(l == ) l=;
for(int i=head[now];i!=-;i=e[i].next) {
if(e[i].v&&h[e[i].to]==-) {
h[e[i].to]=h[now]+;
q[r++]=e[i].to;
if(r==) r = ;
}
}
}
if(h[T]==-) return ;
else return ;
}
int dfs(int x,int f) {
if(x == T) return f;
int used=,w;
for(int i=head[x]; i!=-;i=e[i].next) {
if(e[i].v&&h[e[i].to] == h[x] + ) {
w=dfs(e[i].to,min(f-used,e[i].v));
used+=w;e[i].v-=w;e[i^].v+=w;
if(used == f) return f;
}
}
return used;
}
void dinic() {while(bfs()) ans+=dfs(S,inf);} int k,n,a[N];
vector<int >G[N];
int main() {
scanf("%d%d",&k,&n);S = *(n+k)+,T = S+;
t = ;memset(head,-,sizeof(head));
int sum = ;
for(int i = ; i <= k; ++i) {
scanf("%d",&a[i]);
add(S,i,a[i]);
sum += a[i];
}
for(int i = ; i <= n; ++i) {
int x,y;
scanf("%d",&x);
for(int j = ; j <= x; ++j) {
scanf("%d",&y);
add(y,i+k,);
}
add(i+k,T,);
}
ans = ;
dinic();
if(ans != sum) puts("No Solution!");
else {
for(int i = ; i <= k; ++i) {
printf("%d:",i);
for(int j = head[i]; j!=-; j = e[j].next) {
if(e[j].v == && e[j].to!=S) {
printf(" %d",e[j].to - k);
}
}
printf("\n");
}
}
return ;
}
liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案的更多相关文章
- Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)
Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...
- 【刷题】LOJ 6006 「网络流 24 题」试题库
题目描述 假设一个试题库中有 \(n\) 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 \(m\) 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组 ...
- Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)
Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...
- Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)
Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...
- LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题
#6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...
- [网络流 24 题] luoguP2763 试题库问题
[返回网络流 24 题索引] 题目描述 假设一个试题库中有 nnn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 mmm 道题组成试卷.并要求试卷包含指定类型的试题. ...
- 【PowerOJ1742&网络流24题】试题库问题(最大流)
题意: 思路: [问题分析] 二分图多重匹配问题,用最大流解决. [建模方法] 建立二分图,每个类别为X集合中的顶点,每个题为Y集合中的顶点,增设附加源S和汇T. 1.从S向每个Xi连接一条容量为该类 ...
- [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划
[luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...
- [LOJ#6002]「网络流 24 题」最小路径覆盖
[LOJ#6002]「网络流 24 题」最小路径覆盖 试题描述 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交)的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 ...
随机推荐
- n&(n-1)的用途
最近做LeetCode上面的题目,发现很多题目都用到了n&(n-1).感觉真是神通广大,下面就目前所看到的一些用途总结一下: 1,求一个int类型数是否为2的幂 当n=4时,二进制为:0100 ...
- Python之静态语法检查
Python是一门动态语言.在给python传参数的时候并没有严格的类型限制.写python程序的时候,发现错误经常只能在执行的时候发现.有一些错误由于隐藏的比较深,只有特定逻辑才会触发,往往导致需要 ...
- HDU——2955Robberies(小数背包)
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 12.jsp概述及指令
JSP全名是Java Server Page,它是建立在Servlet规范之上的动态网页开发技术.在JSP文件中,HTML代码与Java代码共同存在.Html代码用来实现网页中静态内容的显示,Java ...
- BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸 ——动态规划
状态设计的方法很巧妙,六个值 h1,h2,h3,t1,t2,t3,我们发现t1,t2,t3可以通过前缀和优化掉一维. 然后考虑把h留下还是t留下,如果留下h显然t是会发生改变的,一个int存不下. 如 ...
- Redis的数据类型及相关操作命令
redis 基础内容 —— redis的数据类型及相关操作的Linux命令.所谓大厦千层基础承载,希望大家认真学习这一讲: 一.redis 的五大数据类型: 1.String(字符串): 2.List ...
- ORACLE无法删除当前连接用户
今天在做Oracle数据库是遇到ORACLE无法删除当前连接用户 ,经查找可用如下方法解决 . 在Oracle中删除用户时提示:ORACLE无法删除当前连接用户 可以用以下语句 Sql代码 ...
- tarkjan求无向图割点模板
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; ; struct node { ...
- LinkedList的构造函数有哪些
LinkedList构造函数有(两种): public LinkedList() public LinkedList(Collection<? extends E> c) /** * Co ...
- bzoj [Scoi2016]美味
[Scoi2016]美味 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 721 Solved: 391[Submit][Status][Discus ...