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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. using namespace std;
  6. const int N=1000005,inf=1e9;
  7. int n,m,h[N],cnt=1,s,t,le[N],sum;
  8. bool vs[N],vt[N];
  9. string c;
  10. struct qwe
  11. {
  12. int ne,to,va;
  13. }e[N<<1];
  14. int read()
  15. {
  16. int r=0,f=1;
  17. char p=getchar();
  18. while(p>'9'||p<'0')
  19. {
  20. if(p=='-')
  21. f=-1;
  22. p=getchar();
  23. }
  24. while(p>='0'&&p<='9')
  25. {
  26. r=r*10+p-48;
  27. p=getchar();
  28. }
  29. return r*f;
  30. }
  31. void add(int u,int v,int w)
  32. {
  33. cnt++;
  34. e[cnt].ne=h[u];
  35. e[cnt].to=v;
  36. e[cnt].va=w;
  37. h[u]=cnt;
  38. }
  39. void ins(int u,int v,int w)
  40. {//cout<<u<<" "<<v<<" "<<w<<endl;
  41. add(u,v,w);
  42. add(v,u,0);
  43. }
  44. bool bfs()
  45. {
  46. queue<int>q;
  47. memset(le,0,sizeof(le));
  48. le[s]=1;
  49. q.push(s);
  50. while(!q.empty())
  51. {
  52. int u=q.front();
  53. q.pop();
  54. for(int i=h[u];i;i=e[i].ne)
  55. if(e[i].va>0&&!le[e[i].to])
  56. {
  57. le[e[i].to]=le[u]+1;
  58. q.push(e[i].to);
  59. }
  60. }
  61. return le[t];
  62. }
  63. int dfs(int u,int f)
  64. {
  65. if(u==t||f==0)
  66. return f;
  67. int us=0;
  68. for(int i=h[u];i&&us<f;i=e[i].ne)
  69. if(e[i].va>0&&le[e[i].to]==le[u]+1)
  70. {
  71. int t=dfs(e[i].to,min(e[i].va,f-us));
  72. e[i].va-=t;
  73. e[i^1].va+=t;
  74. us+=t;
  75. }
  76. if(!us)
  77. le[u]=0;
  78. return us;
  79. }
  80. int dinic()
  81. {
  82. int re=0;
  83. while(bfs())
  84. re+=dfs(s,inf);
  85. return re;
  86. }
  87. int main()
  88. {
  89. m=read(),n=read();
  90. s=0,t=m+n+1;
  91. for(int i=1;i<=m;i++)
  92. {
  93. int x=read();
  94. sum+=x;
  95. ins(s,i,x);
  96. }
  97. for(int i=1;i<=n;i++)
  98. {
  99. int p=read();
  100. for(int j=1;j<=p;j++)
  101. {
  102. int x=read();
  103. ins(x,i+m,1);
  104. }
  105. ins(i+m,t,1);
  106. }
  107. if(dinic()<sum)
  108. {
  109. puts("No Solution!");
  110. return 0;
  111. }
  112. for(int u=1;u<=m;u++)
  113. {
  114. printf("%d: ",u);
  115. for(int i=h[u];i;i=e[i].ne)
  116. if(e[i].to!=s&&!e[i].va)
  117. printf("%d ",e[i].to-m);
  118. puts("");
  119. }
  120. return 0;
  121. }

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

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

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

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

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

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

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

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

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

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

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

  6. P2763 试题库问题(dinic)

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

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

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

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

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

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

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

随机推荐

  1. Spring MVC的Hello World例子

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-mvc-hello-world-example.html: ...

  2. Linux驱动开发:USB驱动之usb_skel分析

    在学习了这么些天的驱动之后,个人觉得驱动就是个架构的问题,只要把架构弄清楚了 然后往里面添砖加瓦就可以了,所以似乎看起来不是太困难,但也许是是我经验不足吧,这只能算是个人浅见了 这两天在学习USB驱动 ...

  3. 【Nginx】http模块的数据结构

    定义fttp模块方式很简单,比如:ngx_module_t ngx_http_mytest_module; 其中,ngx_module_t是一个Nginx模块的数据结构. typedef struct ...

  4. Shell 脚本小试牛刀(5) -- 超便捷脚本之高速ssh 登录其它主机

    假设你也是以Linux 为工作环境的童鞋,那么此文真是捷报!由于我的学习/工作中(特别是近期玩耍树莓派)常常会使用到ssh 登录其它主机,而每次使用ssh 登录都须要输入老长一大串让我非常烦.所以我写 ...

  5. 从JVM的角度看JAVA代码--代码优化

    从JVM的角度看JAVA代码–代码优化 从JVM的角度看JAVA代码代码优化 片段一反复计算 片段二反复比較 在JVM载入优化为class文件,运行class文件时,会有JIT(Just-In-Tim ...

  6. random模块的使用

    random模块用于生成随机数 import random print random.random() #用于生成小于1大于0的数 print random.randint(1,5) #生成大于等于1 ...

  7. ganglia监控自己定义metric实践

    Ganglia监控系统是UC Berkeley开源的一个项目,设计初衷就是要做好分布式集群的监控.监控层面包含资源层面和业务层面,资源层面包含cpu.memory.disk.IO.网络负载等,至于业务 ...

  8. Xsolla和Hi-Rez工作室联手推行SMITE

    视频游戏店面管理和计费解决方式的领导者,Xsolla.将重拳出击将与Hi-Rez游戏工作室合作.该工作室是一家美国的独立游戏开发商,主要开发MOBA游戏-SMITE. 支持全球600多种支付方式 Xs ...

  9. encodeURIComponent

    <script type="text/javascript"> function show(){ var f="#wer中文测试"; f = enc ...

  10. Hibernate中二级缓存指的是什么?

    一.一级缓存.二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中,如果短时间内这个 session(一定要同一个se ...