#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+10, M = 1e3+20,inf = 2e9;int head[N],t=2,h[N],q[N],S,T,ans = 0;
struct edge{int to,next,v;}e[N * 2];
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,0);}
int bfs() {memset(h,-1,sizeof(h));int l=0,r=1,now;q[l]=S;h[S]=0;while(l!=r){now=q[l++];if(l == 100000) l=0;for(int i=head[now];i!=-1;i=e[i].next) {if(e[i].v&&h[e[i].to]==-1) {h[e[i].to]=h[now]+1;q[r++]=e[i].to;if(r==100000) r = 0;}}}if(h[T]==-1) return 0;else return 1;
}
int dfs(int x,int f) {if(x == T) return f;int used=0,w;for(int i=head[x]; i!=-1;i=e[i].next) {if(e[i].v&&h[e[i].to] == h[x] + 1) {w=dfs(e[i].to,min(f-used,e[i].v));used+=w;e[i].v-=w;e[i^1].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 = 2*(n+k)+1,T = S+1;t = 2;memset(head,-1,sizeof(head));int sum = 0;for(int i = 1; i <= k; ++i) {scanf("%d",&a[i]);add(S,i,a[i]);sum += a[i];}for(int i = 1; i <= n; ++i) {int x,y;scanf("%d",&x);for(int j = 1; j <= x; ++j) {scanf("%d",&y);add(y,i+k,1);}add(i+k,T,1);}ans = 0;dinic();if(ans != sum) puts("No Solution!");else {for(int i = 1; i <= k; ++i) {printf("%d:",i);for(int j = head[i]; j!=-1; j = e[j].next) {if(e[j].v == 0 && e[j].to!=S) {printf(" %d",e[j].to - k);}}printf("\n");}}return 0;
}

转载于:https://www.cnblogs.com/zxhl/p/7250654.html

liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案相关推荐

  1. 「网络流24题」试题库问题

    传送门:>Here< 题意:有K种类型的共N道试题用来出卷子,要求卷子须有M道试题.已知每道题属于p种类型,每种类型的试题必须有且仅有k[i]道.现问出这套试卷的一种具体方案 思路分析 昨 ...

  2. LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题

    #6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...

  3. 【网络流24题】试题库问题

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

  4. [网络流24题-9]试题库问题

    试题库问题 我以后!一定!好好读题!(流下悲伤的泪水) 为了避免更多小可爱误解这道题的题意 我重新复述一遍这个题的题意TAT 我们现在有n道题并且每道题有p个属性可以归属 共计k个属性 要求对于每一种 ...

  5. 【LOJ 网络流24题】试题库

    试题库 题解: SSS向mmm种类型连接容量为对应需求量的边,题目种类和对应的属于该种类的题目连流量为1的边,每道题和TTT连流量为111的边,跑最大流即可. #include<bits/std ...

  6. 「网络流24题」 题目列表

    「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...

  7. 「网络流24题」 12. 软件补丁问题

    「网络流24题」 12. 软件补丁问题 状压 DP,SPFA 转移. 没错,跟网络流没任何关系. b1.b2.f1.f2 都用二进制存下来,第 i 位表示是否有这个错误. 然后从每位都是 1 到 0 ...

  8. loj #6226. 「网络流 24 题」骑士共存问题

    #6226. 「网络流 24 题」骑士共存问题 题目描述 在一个 n×n\text{n} \times \text{n}n×n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些 ...

  9. LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

    #6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...

最新文章

  1. Science:若DTC基因检测达2%成年人群,几乎所有人的身份或将无所遁形
  2. CSDN博客生成目录
  3. 软件工程--第三周学习进度
  4. notepad json格式化插件_Prettier + ESLint VSCode 插件配置指南
  5. 公司技术管理角度看C++游戏程序员发展
  6. mplayer-php,mplayer+smplayer 前后端播放器安装
  7. java解析XML Node与Element的区别
  8. 软件详细设计文档模板
  9. 【Ubuntu】安装H.264解码器
  10. java setvalue函数,Java JavaTuples setValue()用法及代码示例
  11. html 给表格添加背景颜色,HTML表格标记教程(7):背景颜色属性BGCOLOR
  12. 微分方程——线性微分方程
  13. oracle提高delete的效率,提高Oracle DELETE性能的策略
  14. Unity 事件中心
  15. 苹果手机删除的视频怎么找回
  16. 关于如何快速学好,学懂Linux内核。内含学习路线
  17. 文件隐藏(windows文件隐藏,利用类标识隐藏)
  18. 华为三个路由器ospf配置案例
  19. 【python】实现一次指数平滑
  20. 第七章:债券投资收益分析与债券合成

热门文章

  1. JIRA官方:JIRA源代码集成
  2. 香港中文大学(深圳)吴保元教授课题组博士后招聘
  3. Kaggle新上比赛:Google AI发起地域包容性图像识别竞赛
  4. Python编程思想是什么?
  5. php定时执行代码漏洞_在CTF比赛中发现的PHP远程代码执行0day漏洞
  6. Re-attention机制Transformer,实现强大性能
  7. PyTorch | torch.linspace()创建均分数列张量 | torch.linspace()如何使用?| torch.linspace()使用方法 | torch.linspace例子
  8. 178页,四年图神经网络研究精华,图卷积网络作者Thomas Kipf博士论文公布
  9. 【项目实践】:KNN实现手写数字识别(附Python详细代码及注释)
  10. Hybrid A*论文解析(5)