原题传送门

这题很简单啊

从源点向k类题目分别连流量为所需数量的边

从每道题向汇点连一条流量为1的边(每题只能用1次)

从类型向对应的题目连一条流量为1的边

跑一遍最大流

如果最大流小于所需题目数量,就无解

否则对于每个类型,看每道题是否要选

  1. #include <bits/stdc++.h>
  2. #define inf 0x3f3f3f3f
  3. #define M 80005
  4. #define N 2005
  5. //#define getchar nc
  6. using namespace std;
  7. inline char nc(){
  8. static char buf[100000],*p1=buf,*p2=buf;
  9. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  10. }
  11. inline int read()
  12. {
  13. register int x=0,f=1;register char ch=getchar();
  14. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  15. while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
  16. return x*f;
  17. }
  18. inline void write(register int x)
  19. {
  20. if(!x)putchar('0');if(x<0)x=-x,putchar('-');
  21. static int sta[20];register int tot=0;
  22. while(x)sta[tot++]=x%10,x/=10;
  23. while(tot)putchar(sta[--tot]+48);
  24. }
  25. inline int Min(register int a,register int b)
  26. {
  27. return a<b?a:b;
  28. }
  29. struct node{
  30. int to,nxt,v;
  31. }e[M];
  32. int head[N],cnt=1;
  33. inline void add(register int u,register int v,register int val)
  34. {
  35. e[++cnt]=(node){v,head[u],val};
  36. head[u]=cnt;
  37. }
  38. int n,k,s,t,nn,maxflow=0,sum=0;
  39. int dep[N],gap[N],cur[N];
  40. inline void bfs()
  41. {
  42. memset(dep,-1,sizeof(dep));
  43. memset(gap,0,sizeof(gap));
  44. dep[t]=0;
  45. ++gap[dep[t]];
  46. queue<int> q;
  47. q.push(t);
  48. while(!q.empty())
  49. {
  50. int u=q.front();
  51. q.pop();
  52. for(register int i=head[u];i;i=e[i].nxt)
  53. {
  54. int v=e[i].to;
  55. if(dep[v]!=-1)
  56. continue;
  57. q.push(v);
  58. dep[v]=dep[u]+1;
  59. ++gap[dep[v]];
  60. }
  61. }
  62. }
  63. inline int dfs(register int u,register int flow)
  64. {
  65. if(u==t)
  66. {
  67. maxflow+=flow;
  68. return flow;
  69. }
  70. int used=0;
  71. for(register int i=cur[u];i;i=e[i].nxt)
  72. {
  73. cur[u]=i;
  74. int v=e[i].to;
  75. if(e[i].v&&dep[v]+1==dep[u])
  76. {
  77. int tmp=dfs(v,Min(e[i].v,flow-used));
  78. if(tmp)
  79. {
  80. e[i].v-=tmp;
  81. e[i^1].v+=tmp;
  82. used+=tmp;
  83. }
  84. if(used==flow)
  85. return used;
  86. }
  87. }
  88. --gap[dep[u]++]==0?dep[s]=nn+1:++gap[dep[u]];
  89. return used;
  90. }
  91. inline void ISAP()
  92. {
  93. bfs();
  94. while(dep[s]<nn)
  95. {
  96. memcpy(cur,head,sizeof(head));
  97. dfs(s,inf);
  98. }
  99. }
  100. int main()
  101. {
  102. k=read(),n=read();
  103. s=0,t=k+n+1;
  104. for(register int i=1;i<=k;++i)
  105. {
  106. int x=read();
  107. add(s,i,x),add(i,s,0),sum+=x;
  108. }
  109. for(register int i=1;i<=n;++i)
  110. {
  111. int p=read();
  112. for(register int j=1;j<=p;++j)
  113. {
  114. int x=read();
  115. add(x,i+k,1),add(i+k,x,0);
  116. }
  117. add(i+k,t,1),add(t,i+k,0);
  118. }
  119. nn=n+k+2;
  120. ISAP();
  121. if(maxflow==sum)
  122. for(register int u=1;u<=k;++u)
  123. {
  124. write(u),putchar(':'),putchar(' ');
  125. for(register int i=head[u];i;i=e[i].nxt)
  126. if(e[i].to!=0&&e[i].v==0)
  127. write(e[i].to-k),putchar(' ');
  128. puts("");
  129. }
  130. else
  131. puts("No Solution!");
  132. return 0;
  133. }

【题解】Luogu P2763 试题库问题的更多相关文章

  1. 【题解】 P2763 试题库问题(网络流)

    P2763 试题库问题 考虑一个试题要被加入进答案的集合有什么条件? 是某种类型 只算作一次 就这两种且的限制,所以我们用串联的方式连接"类型点"和"作用点". ...

  2. luogu P2763 试题库问题

    本题可以用最大流也可以用最大匹配(本质一样),用dinic最大流好建图,但码量大,匈牙利码量小,建图费点劲. 最大流:依旧是设一个源点一个汇点,对于每一个种类,连一条到汇点的边,capacity为需要 ...

  3. P2763 试题库问题(dinic)

    P2763 试题库问题 dinic 搞个虚拟源点和汇点,瞎建建边就好辣. 偷张图↓↓ 如果没满流就是无解辣 输出方案咋办呢? 枚举每种类型,蓝后枚举它们的边 如果该边被使用了(通过判断反向边的流量), ...

  4. Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)

    Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...

  5. 网络流问题 P2763 试题库问题

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

  6. 洛谷 P2763 试题库问题(网络流24题之一)

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

  7. [洛谷P2763]试题库问题

    题目大意:有 $k$ 种类型和 $n$ 个题目,每个题目会适应部分类型,第$i$个类型需要$s_i$的题,一道题只能满足一种类型,现要求出满足所有类型的题目的方案 题解:看到匹配,想到网络流,源点向试 ...

  8. 洛谷P2763 试题库问题(最大流)

    题意 $n$道试题,每道题有多种类别属性 抽取$m$道题组成试卷,要求包含指定的类型 输出方案 Sol 又是一道zz网络流 我的构图长这样,$k_i$表示第$i$道试题需要的数量 #include&l ...

  9. P2763 试题库问题 (网络流 最大流)

    传送门 解题思路 比较简单的网络流,建图还是比较好想的.让源点向试题连流量为1的边,试题向所属类型连流量为1的边,类型向汇点连流量为需要此类试题的边.直接跑最大流,输出答案时找到那些满流的边所对的点. ...

随机推荐

  1. Centos6.8 安装dlib库时出错【升级gcc 到4.9.0以上】

    在centos6.8上安装dlib库时出现错误: 1.CMake must be installed to build the following extensions: dlib 没有安装CMake ...

  2. QT下的贪吃蛇

    QT写的贪吃蛇,学习于https://www.devbean.net/2012/12/qt-study-road-2-snake-1/ 建议就学习一下开发思想,开发游戏还是用专门的编译器. 多加了墙, ...

  3. eclipse测试链接sql server2008 数据库

    注:在测试连接数据库之前必须保证SQL Server 2008是采用SQL Server身份验证方式而不是windows身份验证方式.如果在安装时选用了后者,则需要重新进行配置. 首先 使用命令行测试 ...

  4. js中级小知识5

    元素的属性 div.attributes是所有标签属性构成的数据集合 div.classList是所有class名构成的数组集合 在classList的原型链上可以看到add()和remove() 1 ...

  5. git fork代码并修改胡提交到自己的git仓库

    最近在参加阿里天池大数据中间件比赛(毫无头绪,打酱油中).看参赛要求,需要将官网的git工程clone下来,在此基础上做修改后提交到自己的仓库中. 由于以前并没有使用过git,所以差了比较多的资料,做 ...

  6. 浅谈 pid的原理与差异

    pid  官方语言就是:比例   积分 微分.究其本质意义,比例到底是什么,原理是什么,这三个到底如何在物理世界这种运作的,大概了解的人又很少.过惯了拿起数据公式无脑推的日子的人更是如此,数学公式是很 ...

  7. ES6 数组方法拓展

    ES6 数组方法拓展 1.Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括E ...

  8. Presto实战

    一.Presto简介 1.PRESTO是什么? Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节. Presto的设计和编写完全是为了解决像Facebook ...

  9. scala-创建泛型数组(T: Manifest)

    def arrayT[T: Manifest](ary: T*): Array[T] = {//接受多个参数 val arys = new Array[T](ary.length) //初始化一个数组 ...

  10. Vue Watch 的原理 和 $nextTick() 通俗理解

    网上watch和$nextTick()解释比较复杂,涉及到promise,h5的dom发生变化的新api等复杂代码,下列就是两个参考. [watch原理] [$nextTick()] 首先,看遇到问题 ...