P2763 试题库问题

考虑一个试题要被加入进答案的集合有什么条件?

  • 是某种类型
  • 只算作一次

就这两种且的限制,所以我们用串联的方式连接"类型点"和"作用点"。

判断无解就判断容量是否满了。输出方案就输出有流量的边的终点。

  1. //@winlere
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std; typedef long long ll;
  8. inline int qr(){
  9. register int ret=0,f=0;
  10. register char c=getchar();
  11. while(c<48||c>57)f|=c==45,c=getchar();
  12. while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
  13. return f?-ret:ret;
  14. }
  15. const int inf=0x3f3f3f3f;
  16. const int maxn=1.9e3+5;
  17. int nodecnt;
  18. struct E{
  19. int to,nx,w;
  20. }e[50005];
  21. int head[maxn];
  22. int cur[maxn];
  23. int d[maxn];
  24. int cnt=-1,S,T,n,m,k;
  25. vector< int > ve[maxn];
  26. inline void add(const int&fr,const int&to,const int&w,const int&f){
  27. //printf("fr=%d to=%d w=%d cnt=%d\n",fr,to,w,cnt);
  28. e[++cnt]={to,head[fr],w};
  29. head[fr]=cnt;
  30. if(f)add(to,fr,0,0);
  31. }
  32. queue< int >q;
  33. inline bool bfs(){
  34. for(register int t=1;t<=n+k+2;++t) cur[t]=head[t],d[t]=0;
  35. q.push(S);
  36. d[S]=1;
  37. while(!q.empty()){
  38. register int now=q.front();
  39. q.pop();
  40. if(now==T)continue;
  41. for(register int t=head[now];t!=-1;t=e[t].nx){
  42. if(!d[e[t].to]&&e[t].w>0){
  43. d[e[t].to]=d[now]+1;
  44. q.push(e[t].to);
  45. }
  46. }
  47. }
  48. return d[T];
  49. }
  50. int dfs(const int&now,const int&last,int fl){
  51. if(now==T||fl==0)return fl;
  52. register int ret=0;
  53. for(register int&t=cur[now];t!=-1;t=e[t].nx){
  54. if(e[t].w>0&&d[e[t].to]==d[now]+1&&fl){
  55. int d=dfs(e[t].to,now,min(fl,e[t].w));
  56. e[t].w-=d;e[t^1].w+=d;ret+=d;fl-=d;
  57. }
  58. }
  59. return ret;
  60. }
  61. inline int dinic(){
  62. register int ret=0;
  63. while(bfs()) ret+=dfs(S,0,inf);
  64. return ret;
  65. }
  66. int main(){
  67. freopen("testlib.in","r",stdin);
  68. freopen("testlib.out","w",stdout);
  69. memset(head,-1,sizeof head);
  70. k=qr();n=qr();
  71. S=1;T=k+n+2;
  72. for(register int t=1;t<=k;++t)
  73. add(S,t+1,qr(),1);
  74. for(register int t=1,t1;t<=n;++t){
  75. t1=qr();
  76. for(register int i=1;i<=t1;++i)
  77. add(qr()+1,t+k+1,1,1);
  78. add(t+k+1,T,1,1);
  79. }
  80. dinic();
  81. int ok=1;
  82. for(register int t=head[S];t!=-1;t=e[t].nx)
  83. if(e[t].w) ok=0;
  84. if(ok) {
  85. //printf("%d\n",f);
  86. for(register int now=2;now<=k+1;++now){
  87. printf("i:%d ",now-1);
  88. for(register int t=head[now];t!=-1;t=e[t].nx)
  89. if(e[t].to!=1&&e[t].w==0)
  90. printf("%d ",e[t].to-k-1);
  91. putchar('\n');
  92. }
  93. }
  94. else puts("No Solution!");
  95. return 0;
  96. }

【题解】 P2763 试题库问题(网络流)的更多相关文章

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

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

  2. P2763 试题库问题(dinic)

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

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

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

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

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

  5. 【题解】Luogu P2763 试题库问题

    原题传送门 这题很简单啊 从源点向k类题目分别连流量为所需数量的边 从每道题向汇点连一条流量为1的边(每题只能用1次) 从类型向对应的题目连一条流量为1的边 跑一遍最大流 如果最大流小于所需题目数量, ...

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

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

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

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

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

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

  9. P2763 试题库问题

    传送门 显然的网络流,源点向所有题目连流量为1的边,表示一题只能用一次,题目向它的所有类型连边,流量设为1,类型向汇点连边流量为题目需要的该类型的数量 然后最大流 如果最大流小于总需要的类型题目数量则 ...

随机推荐

  1. 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google

    摘要: 作为此次Gartner报告中唯一上榜的中国科技公司,阿里云获得六个评判维度的最高分,排名第二 近日,知名调研机构Gartner发布了全球领先公共云厂商区块链服务能力报告,作为唯一上榜的中国科技 ...

  2. 走近科学,探究阿里闲鱼团队通过数据提升Flutter体验的真相

    背景 闲鱼客户端的flutter页面已经服务上亿级用户,这个时候Flutter页面的用户体验尤其重要,完善Flutter性能稳定性监控体系,可以及早发现线上性能问题,也可以作为用户体验提升的衡量标准. ...

  3. python常量和变量

    1.1 常量 常量是内存中用于保存固定值的单元,在程序中常量的值不能发生改变:python并没有命名常量,也就是说不能像C语言那样给常量起一个名字. python常量包括:数字.字符串.布尔值.空值: ...

  4. 洛谷P2947 [USACO09MAR]向右看齐Look Up

    #include<cstdio> #include<algorithm> #include<stack> #include<cctype> using ...

  5. 2019-8-31-dotnet-使用-MessagePack-序列化对象

    title author date CreateTime categories dotnet 使用 MessagePack 序列化对象 lindexi 2019-08-31 16:55:58 +080 ...

  6. oracle选择最有效率的表名顺序

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条 ...

  7. oracle函数 power(x,y)

    [功能]返回x的y次幂 [参数]x,y 数字型表达式 [返回]数字 [示例] select power(2.5,2),power(1.5,0),power(20,-1) from dual; 返回:6 ...

  8. supersockets支持热更新的服务器实例配置选项

    SuperSocket 支持以下配置选项的热更新: * logCommand * idleSessionTimeOut * maxRequestLength * logBasicSessionActi ...

  9. 2017年NOIP普及组复赛题解

    题目涉及算法: 成绩:入门题: 图书管理员:模拟: 棋盘:最短路/广搜: 跳房子:RMQ/二分答案/DP(本人解法). 成绩 题目链接:https://www.luogu.org/problemnew ...

  10. 一次操作系统报错OutOfMemory Error的处理记录

    在启动公司内嵌的tomcat容器时出现报错, 如下: # There is insufficient memory for the Java Runtime Environment to contin ...