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

    ★★ 输入文件:testlib.in 输出文件:testlib.out 评测插件

    时间限制:1 s 内存限制:128 MB

    «问题描述:

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

    «编程任务:

    对于给定的组卷要求,计算满足要求的组卷方案。

    «数据输入:

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

    «结果输出:

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

    输入文件示例

    testlib.in

    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

    输出文件示例

    testlib.out

    1: 1 6 8

    2: 7 9 10

    3: 2 3 4 5
  1. /*
  2. 建图挺简单的
  3. 跑二分图最大匹配.
  4. 主要是print.
  5. 也挺简单的 搞搞流量就好了..
  6. 反正这题挺简单的...
  7. */
  8. #include<iostream>
  9. #include<cstdio>
  10. #include<cstring>
  11. #include<algorithm>
  12. #include<queue>
  13. #define MAXN 2001
  14. #define INF 1e9
  15. using namespace std;
  16. int n,k,S,T,ans,sum,cut=1,tot,tmp[MAXN],dis[MAXN],head[MAXN],c[MAXN],p[MAXN];
  17. queue<int>q;
  18. bool b[MAXN];
  19. struct data{int u,v,next,c;}e[MAXN*6];
  20. int read()
  21. {
  22. int x=0,f=1;char ch=getchar();
  23. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  24. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  25. return x*f;
  26. }
  27. void add(int u,int v,int c)
  28. {
  29. e[++cut].u=u;e[cut].v=v;e[cut].c=c;e[cut].next=head[u];head[u]=cut;
  30. e[++cut].u=v;e[cut].v=u;e[cut].c=0;e[cut].next=head[v];head[v]=cut;
  31. }
  32. bool bfs()
  33. {
  34. for(int i=S;i<=T;i++) dis[i]=-1;dis[S]=0;
  35. q.push(S);
  36. while(!q.empty())
  37. {
  38. int u=q.front();q.pop();b[u]=0;
  39. for(int i=head[u];i;i=e[i].next)
  40. {
  41. int v=e[i].v;
  42. if(dis[v]==-1&&e[i].c)
  43. {
  44. dis[v]=dis[u]+1;
  45. q.push(v);
  46. }
  47. }
  48. }
  49. return dis[T]!=-1;
  50. }
  51. int dfs(int u,int y)
  52. {
  53. if(u==T) return y;
  54. int rest=0;
  55. for(int i=head[u];i&&rest<y;i=e[i].next)
  56. {
  57. int v=e[i].v;
  58. if(dis[v]==dis[u]+1&&e[i].c)
  59. {
  60. int x=dfs(v,min(y-rest,e[i].c));
  61. e[i].c-=x;
  62. e[i^1].c+=x;
  63. rest+=x;
  64. }
  65. }
  66. if(!rest) dis[u]=-1;
  67. return rest;
  68. }
  69. void slove()
  70. {
  71. tot=0;
  72. for(int i=n+1;i<=n+k;i++)
  73. {
  74. tot=0;printf("%d:",i-n);
  75. for(int j=head[i];j;j=e[j].next)
  76. if(e[j^1].c&&e[j].v!=T) tmp[++tot]=e[j].v;
  77. sort(tmp+1,tmp+tot+1);
  78. for(int j=1;j<=tot;j++) printf(" %d",tmp[j]);
  79. printf("\n");
  80. }
  81. return ;
  82. }
  83. void dinic()
  84. {
  85. while(bfs()) ans+=dfs(S,INF);
  86. if(ans==sum) slove();
  87. else printf("NoSolution!");
  88. }
  89. int main()
  90. {
  91. freopen("testlib.in","r",stdin);
  92. freopen("testlib.out","w",stdout);
  93. int x,t;
  94. k=read(),n=read();S=0,T=n+k+1;
  95. for(int i=1;i<=k;i++) x=read(),sum+=x,add(i+n,T,x);
  96. for(int i=1;i<=n;i++)
  97. {
  98. add(S,i,1);t=read();
  99. while(t--) x=read(),add(i,x+n,1);
  100. }
  101. dinic();
  102. return 0;
  103. }

Cogs 732. [网络流24题] 试题库(二分图)的更多相关文章

  1. Cogs 14. [网络流24题] 搭配飞行员(二分图匹配)

    [网络流24题] 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有若干个来自各地的驾驶员,专门 ...

  2. cogs 14. [网络流24题] 搭配飞行员 二分图最大匹配 匈牙利算法

    14. [网络流24题] 搭配飞行员 ★★   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行大队有 ...

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

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

  4. 网络流24题——试题库问题 luogu 2763

    题目描述看:这里 这是我们遇到的第一个要求输出方案的问题 考虑建图然后用最大流思想: 首先由源点向每一道试题连边,容量为1 然后由每一种试题类型向汇点连边,容量为需求量 最后由每一道试题向可能属于的试 ...

  5. Cogs 729. [网络流24题] 圆桌聚餐

    [网络流24题] 圆桌聚餐 ★★ 输入文件:roundtable.in 输出文件:roundtable.out 评测插件 时间限制:1 s 内存限制:128 MB «问题描述: 假设有来自m 个不同单 ...

  6. [COGS 0014][网络流24题] 搭配飞行员

    先贴题面 14. [网络流24题] 搭配飞行员 ★★☆   输入文件:flyer.in   输出文件:flyer.out简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行 ...

  7. Cogs 734. [网络流24题] 方格取数问题(最大闭合子图)

    [网络流24题] 方格取数问题 ★★☆ 输入文件:grid.in 输出文件:grid.out 简单对比 时间限制:1 s 内存限制:128 MB «问题描述: 在一个有m*n 个方格的棋盘中,每个方格 ...

  8. Cogs 746. [网络流24题] 骑士共存(最大独立集)

    [网络流24题] 骑士共存 ★★☆ 输入文件:knight.in 输出文件:knight.out 简单对比 时间限制:1 s 内存限制:128 MB 骑士共存问题 «问题描述: 在一个n*n个方格的国 ...

  9. cogs 728. [网络流24题] 最小路径覆盖问题 匈牙利算法

    728. [网络流24题] 最小路径覆盖问题 ★★★☆   输入文件:path3.in   输出文件:path3.out   评测插件时间限制:1 s   内存限制:128 MB 算法实现题8-3 最 ...

随机推荐

  1. phpdocmentor 生成php 开发文档(转载)

    PHPDocumentor是一个用PHP写的工具,对于有规范注释的php程序,它能够快速生成具有相互参照,索引等功能的API文档.老的版本是phpdoc,从1.3.0开始,更名为phpDocument ...

  2. WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围

    原文:WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围 WPF 的 VisualBrush 可以帮助我们在一个控件中显示另一个控件的外观.这是非常妙的功能. 但是本文需要说其中 ...

  3. c#利用定时器自动备份数据库(mysql)

    1:引用dll MySql.Data.dll,   MySqlbackup.dll 2:建一个数据连接静态类 public static class mysql{public static strin ...

  4. provide inject应用及和props对比

    之前本人写过几篇element ui源码解析,其中提到provide/inject,当时只是匆匆带过,没有做深入研究,直到后来一次开发,需要实现孙组件更改父组件的值才想起来,原来这一对属性有如此大的用 ...

  5. IVS_技术

    视频监控技术按照设备发展过程分为三个阶段:模拟视频监控.数字视频监控.智能视频监控,如下图: 模拟视频监控 第一代视频监控系统也叫做闭路电视监控系统,简称CCTV(Close Circuit Tele ...

  6. 如何去除有道云笔记广告(windows)

    一.适用于6.0之前版本 你只需要:找到有道云笔记的安装路径,*\Youdao\YoudaoNote\theme\build.xml 用笔记本打开这个文件,找到'左下角广告'这几个字,把下面的代码删掉 ...

  7. MySQL Percona Toolkit--pt-osc与online DDL选择

    pt-osc和online ddl选择 1.如果表存在触发器,不能使用pt-osc.2.如果新增唯一索引,不建议使用pt-osc,以免数据丢失.3.修改索引.外键.列名时,优先选择使用ALGORITH ...

  8. linux档案和目录的管理

    资料来自鸟哥的linux私房菜,记录下来供自己平常使用参考 一:目录和路径: cd:change direcoty,变换目录的意思,就是从一个目录变到另一个目录,然后可以用绝对路径去变换目录,也可以用 ...

  9. MYSQL中常见的时间处理

    use test; select getdate() select sysdate(); select now(); select current_timestamp select current_t ...

  10. 性能测试基础---URL和HTTP协议

    ·URL和HTTP协议: ·URL构成: URL是web应用进行资源访问的主要方式.一般来说,由五个部分构成: 示例:http://192.168.2.212/phpwind1/searcher.ph ...