题目链接

6/23

这是网络流23题里我第一个没看题解自己写出来一遍过的。。

这题应该是最简单的模型了吧。

从源点向每个类型连一条流量为这个类型要的题数,再从每个类型向可以属于这个类型的所有试题连一条流量为1的边,最后从所有试题向汇点连一条流量为1的边。

跑最大流就行。判断边有没有流量。

  1. // luogu-judger-enable-o2
  2. #include <cstdio>
  3. #include <queue>
  4. #define INF 2147483647
  5. using namespace std;
  6. const int MAXN = 100010;
  7. inline int read(){
  8. int s = 0, w = 1;
  9. char ch = getchar();
  10. while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); }
  11. while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
  12. return s * w;
  13. }
  14. struct Edge{
  15. int next, to, from, rest;
  16. }e[MAXN];
  17. int s, t, num = 1, n, m, a;
  18. int head[MAXN];
  19. inline void Add(int from, int to, int flow){
  20. e[++num] = (Edge){ head[from], to, from, flow }; head[from] = num;
  21. e[++num] = (Edge){ head[to], from, to, 0 }; head[to] = num;
  22. }
  23. int flow[MAXN], pre[MAXN], dfn[MAXN], Time, now, sum;
  24. queue <int> q;
  25. int re(){
  26. pre[t] = 0; flow[s] = INF;
  27. q.push(s); dfn[s] = ++Time;
  28. while(q.size()){
  29. now = q.front(); q.pop();
  30. for(int i = head[now]; i; i = e[i].next)
  31. if(dfn[e[i].to] != Time && e[i].rest){
  32. dfn[e[i].to] = Time; q.push(e[i].to);
  33. flow[e[i].to] = min(flow[now], e[i].rest);
  34. pre[e[i].to] = i;
  35. }
  36. }
  37. return pre[t];
  38. }
  39. int dinic(){
  40. int ans = 0;
  41. while(re()){
  42. ans += flow[t];
  43. now = t;
  44. while(now != s){
  45. e[pre[now]].rest -= flow[t];
  46. e[pre[now] ^ 1].rest += flow[t];
  47. now = e[pre[now]].from;
  48. }
  49. }
  50. return ans;
  51. }
  52. int main(){
  53. s = 99999; t = 100000;
  54. n = read(); m = read();
  55. for(int i = 1; i <= n; ++i){
  56. sum += a = read();
  57. Add(s, i, a);
  58. }
  59. for(int i = 1; i <= m; ++i){
  60. a = read();
  61. for(int j = 1; j <= a; ++j)
  62. Add(read(), i + 1010, 1);
  63. Add(i + 1010, t, 1);
  64. }
  65. if(dinic() == sum)
  66. for(int i = 1; i <= n; ++i){
  67. printf("%d: ", i);
  68. for(int j = head[i]; j; j = e[j].next)
  69. if(e[j].to != s && !e[j].rest)
  70. printf("%d ", e[j].to - 1010);
  71. putchar('\n');
  72. }
  73. else printf("No Solution!\n");
  74. return 0;
  75. }

【洛谷 P2763】 试题库问题(最大流)的更多相关文章

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

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

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

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

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

    传送门 网络流界的一股清流啊……终于没那么变态了…… 考虑一下怎么建图.对于每一个类型,我们从$S$向他连边,容量为它所需的题数,表明它要可以有这么多题,对于每一道题目,我们从它对应的类型向他连边,容 ...

  4. 洛谷 P2763 试题库问题【最大流】

    s向所有类别属性连流量为当前类别属性需要的个数的边,所有题目向t连流量为1的边(表示只能选一次),所有属性向含有它的题连容量为1的边.跑一变dinic,结果小于m则无解,否则看每一个类别属性连出去的题 ...

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

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

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

    非常舒适的最大流 非常显然的建图方法,然而因为数组开小卡了很长时间 #include <iostream> #include <cstdio> #include <alg ...

  7. P2763 试题库问题(dinic)

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

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

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

  9. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

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

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

随机推荐

  1. Python 元组 集合

    1. 元组 >>> a = (1,2,3,4,5) >>> b = list(a) #转换成列表对象, 可以更改 >>> b [1, 2, 3, ...

  2. headers的描述

    Cache-Control 作用: 这个是非常重要的规则. 这个用来指定Response-Request遵循的缓存机制.各个指令含义如下 Cache-Control:Public   可以被任何缓存所 ...

  3. Python实现XML的操作

    本文从以下两个方面, 用Python实现XML的操作: 一. minidom写入XML示例1 二. minidom写入XML示例2 三. ElementTree写入/修改示例 四. ElementTr ...

  4. 【Linux】- vi/vim

    所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...

  5. windows默认TEMP环境

    留着是为了等出问题的时候能找着改回来 Administrator 的用户变量 TEMP     %USERPROFILE%\AppData\Local\Temp TMP        %USERPRO ...

  6. C#的垃圾回收

    C#中垃圾回收 GC.Collect();强制进行内存回收.

  7. HUAS 1477 经营与开发(贪心)

    考虑DP,令dp[i][j][k]当前在第i个星球,用了j次维修,k次开采后所获得的最大价值.复杂度为O(n^3).超时 如果我们发现,对于初始时能力值为w所能产生的最大价值y,初始时能力值为1所能产 ...

  8. BZOJ 1221 软件开发(费用流)

    容易看出这是显然的费用流模型. 把每天需要的餐巾数作为限制.需要将天数拆点,x’表示每天需要的餐巾,x’’表示每天用完的餐巾.所以加边 (s,x',INF,0),(x'',t,INF,0). 餐巾可以 ...

  9. BZOJ 1070 修车(费用流)

    如果能想到费用流,这道题就是显然了. 要求所有人的等待平均时间最小,也就是所有人的总等待时间最小. 每辆车只需要修一次,所以s连每辆车容量为1,费用为0的边. 现在需要把每个人拆成n个点,把车和每个人 ...

  10. hadoop中DataNode消失挂掉的原因及解决方法

    昨天在进行Hadoop实验时遇到一个问题,在sbin目录下输入jps命令,查看当前节点的状态时,意外发现DataNode节点不见了!!于是回忆了一下自己之前的操作过程,大概是因为将自己进入文件夹,将某 ...