Description

假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别 属性。现要从题库中抽取m 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个 满足要求的组卷算法。 编程任务: 对于给定的组卷要求,计算满足要求的组卷方案。

Input

由文件input.txt提供输入数据。文件第1行有2个正整数k和n (2 <=k<= 20, k<=n<= 1000) k 表示题库中试题类型总数,n 表示题库中试题总数。第2 行有k 个正整数,第i 个正整数 表示要选出的类型i 的题数。这k个数相加就是要选出的总题数m。接下来的n行给出了题 库中每个试题的类型信息。每行的第1 个正整数p表明该题可以属于p类,接着的p个数是 该题所属的类型号。

Output

程序运行结束时,将组卷方案输出到文件output.txt 中。文件第i 行输出 “i:”后接类 型i的题号。如果有多个满足要求的方案,只要输出1 个方案。如果问题无解,则输出“No Solution!”。

Sample Input

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
Sample Output

1: 1 6 8
2: 7 9 10
3: 2 3 4 5
题解:
(S,每一道题,1) (每种题型,T,需要的数量)(每道题,所属类型,1)
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=1205,INF=1999999999;
 7 int gi(){
 8     int str=0;char ch=getchar();
 9     while(ch>'9'||ch<'0')ch=getchar();
10     while(ch>='0' && ch<='9')str=str*10+ch-'0',ch=getchar();
11     return str;
12 }
13 int n,m,S=0,T,num=1,head[N];
14 struct Lin{
15     int next,to,dis;
16 }a[N*N];
17 void init(int x,int y,int z){
18     a[++num].next=head[x];
19     a[num].to=y;
20     a[num].dis=z;
21     head[x]=num;
22     a[++num].next=head[y];
23     a[num].to=x;
24     a[num].dis=0;
25     head[y]=num;
26 }
27 int dep[N],q[N];
28 bool bfs()
29 {
30     memset(dep,0,sizeof(dep));
31     dep[S]=1;q[1]=S;int u,t=0,sum=1,x;
32     while(t!=sum)
33     {
34         x=q[++t];
35         for(int i=head[x];i;i=a[i].next){
36             u=a[i].to;
37             if(dep[u] || a[i].dis<=0)continue;
38             dep[u]=dep[x]+1;q[++sum]=u;
39         }
40     }
41     return dep[T];
42 }
43 int dfs(int x,int flow)
44 {
45     if(x==T || !flow)return flow;
46     int u,tmp,sum=0;
47     for(int i=head[x];i;i=a[i].next){
48         u=a[i].to;
49         if(dep[u]!=dep[x]+1 || a[i].dis<=0)continue;
50         tmp=dfs(u,min(flow,a[i].dis));
51         a[i].dis-=tmp;a[i^1].dis+=tmp;
52         sum+=tmp;flow-=tmp;
53         if(!flow)break;
54     }
55     return sum;
56 }
57 int main()
58 {
59     int x,k,sum1=0;
60     m=gi();n=gi();
61     T=n+m+1;
62     for(int i=1;i<=m;i++){
63         x=gi();init(i+n,T,x);sum1+=x;
64     }
65     for(int i=1;i<=n;i++){
66         init(S,i,1);
67         k=gi();
68         for(int j=1;j<=k;j++)x=gi(),init(i,x+n,1);
69     }
70     int tot=0,tmp;
71     while(bfs()){
72         tmp=dfs(S,INF);
73         while(tmp)tot+=tmp,tmp=dfs(S,INF);
74     }
75     if(tot<sum1){
76         puts("No Solution!");
77         return 0;
78     }
79     for(int i=1+n;i<=n+m;i++){
80         printf("%d:",i-n);
81         for(int j=head[i];j;j=a[j].next)
82         if(a[j].to!=T && a[j].dis==1)printf(" %d",a[j].to);
83         puts("");
84     }
85     return 0;
86 }

转载于:https://www.cnblogs.com/Yuzao/p/6872881.html

【网络流24题】试题库问题相关推荐

  1. COGS732. [网络流24题] 试题库

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

  2. [网络流24题]试题库问题

    [luogu 2763] 试题库问题 传送门 二分图多重匹配 建图方法: s=0,t=n+m+1 (1)S向第i个试题连边,容量为1,保证每个试题只被选一次 (2)第i个试题编号为i,向所属种类连边, ...

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

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

  4. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

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

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

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

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

  7. 【题解】网络流24题一句话题解集合

    最近写了下<线性规划与网络流24题>,发下代码和题解,事实上就是将交给cycycy的题解复制一下 T1 飞行员配对方案问题 solution 裸的匈牙利 code #include< ...

  8. cwl的网络流24题练习

    网络流24题 编号 题目 备注 1 飞行员配对方案问题 二分图最大匹配,可最大流解决 2 太空飞行计划问题   3 最小路径覆盖问题  有向图最小路径覆盖,解法都写题目上了 4 魔术球问题  有向图最 ...

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

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

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

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

最新文章

  1. 10月21日!API 大赛决赛暨移动云开发者论坛邀您见证数字创新的力量
  2. php或js判断网站访问者来自手机或者pc端源码
  3. 计算机发现概述教案,计算机网络概述教案
  4. 火的不要不要的公有云和私有云都是什么鬼?
  5. Linux errno 列表
  6. IBM服务器巡检流程
  7. DevExpress.Utils.ToolTipLocation
  8. ActiveMQ(07):ActiveMQ结合Spring开发--建议
  9. 万紫千红总是春的上一句是什么,万紫千红总是春全诗赏析
  10. 慢慢的,就没有了,就像从未存在过(转载)
  11. 信号量内核对象 semaphore
  12. 在Winform开发框架中实现对数据库的加密支持(转)
  13. 51单片机学习历程(二)快速入门51单片机
  14. Quartus17.0 + ModelSim - IntelFpga安装及破解
  15. 云计算安全需求分析与网络
  16. 计算机一级汉字录入在线联系,计算机一级考试指导:汉字录入题的操作(3)
  17. 开心的小明-动态规划算法
  18. c语言cl.exe,cl.exe
  19. 禁闭岛》剧情全解,结局只有一个,导演小细节处...
  20. java的万里长征之第一步

热门文章

  1. 斯坦福大学Andrew Ng - 机器学习笔记(3) -- 神经网络模型
  2. ubuntu install opengl
  3. IOS-webService
  4. 上海巨人网络参与网络诈骗整个流程
  5. java实现qq_java实现的类似qq聊天系统
  6. linux下find命令用法
  7. OVS对VXLAN报文解封包
  8. linux查看apache端口,linux系统下Apache服务启动时80端口报错
  9. uniapp怎么引入css_uniapp - css样式设置scoped
  10. python安装venv_Python创建virtualenv(虚拟环境)方法及安装Ubuntu