传送门

解题思路

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #include<vector>
  6.  
  7. using namespace std;
  8. const int MAXN = ;
  9. const int MAXM = ;
  10. const int inf = 0x3f3f3f3f;
  11.  
  12. inline int rd(){
  13. int x=,f=;char ch=getchar();
  14. while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
  15. while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
  16. return f?x:-x;
  17. }
  18.  
  19. int k,n,head[MAXN],cnt=,d[MAXN],sum,Sum;
  20. int S=,T=,to[MAXM<<],nxt[MAXM<<],val[MAXM<<];
  21. queue<int> Q;vector<int> ans[MAXN];
  22.  
  23. inline void add(int bg,int ed,int w){
  24. to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt;
  25. }
  26.  
  27. bool bfs(){
  28. while(Q.size()) Q.pop();memset(d,,sizeof(d));
  29. d[S]=;Q.push(S);
  30. while(!Q.empty()){
  31. int x=Q.front();Q.pop();
  32. for(register int i=head[x];i;i=nxt[i]){
  33. int u=to[i];
  34. if(!d[u] && val[i]) {
  35. d[u]=d[x]+;Q.push(u);
  36. if(u==T) return true;
  37. }
  38. }
  39. }
  40. return false;
  41. }
  42.  
  43. int dinic(int x,int flow){
  44. if(x==T) return flow;
  45. int res=flow,k;
  46. for(register int i=head[x];i && res;i=nxt[i]){
  47. int u=to[i];
  48. if(d[u]==d[x]+ && val[i]){
  49. k=dinic(u,min(flow,val[i]));
  50. if(!k) d[u]=;
  51. val[i]-=k;val[i^]+=k;res-=k;
  52. }
  53. }
  54. return flow-res;
  55. }
  56.  
  57. int main(){
  58. k=rd(),n=rd();int x,y;
  59. for(int i=;i<=k;i++)
  60. x=rd(),add(i,T,x),add(T,i,),Sum+=x;
  61. for(int i=;i<=n;i++){
  62. x=rd();
  63. for(int j=;j<=x;++j){
  64. y=rd();add(i+k,y,);add(y,i+k,);
  65. }
  66. }
  67. for(int i=;i<=n;i++) add(S,i+k,),add(i+k,S,);
  68. while(bfs()) sum+=dinic(S,inf);
  69. // cout<<sum<<endl;
  70. for(int i=;i<=k;i++)
  71. for(int j=head[i];j;j=nxt[j]){
  72. if(to[j]==T) continue;
  73. if(!val[j^]) ans[i].push_back(to[j]-k);
  74. }
  75. for(int i=;i<=k;i++){
  76. printf("%d: ",i);
  77. for(int j=;j<ans[i].size();j++) printf("%d ",ans[i][j]);
  78. printf("\n");
  79. }
  80. return ;
  81. }

P2763 试题库问题 (网络流 最大流)的更多相关文章

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

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

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

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

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

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

  4. P2763 试题库问题(dinic)

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

  5. 【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

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

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

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

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

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

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

    题目链接 6/23 这是网络流23题里我第一个没看题解自己写出来一遍过的.. 这题应该是最简单的模型了吧. 从源点向每个类型连一条流量为这个类型要的题数,再从每个类型向可以属于这个类型的所有试题连一条 ...

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

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

随机推荐

  1. iOS录音后播放声音变小的解决方法

    目前需求是录音之后再播放出来.经常会出现播放声音变很小的情况. 解决方法: if (recorder.recording){ [recorder stop]; } [[AVAudioSession s ...

  2. 个人使用Viso绘制的简单神经网络实现原理图

  3. Linux 档案目录的结构及功能(鸟哥私房菜)

  4. c++11 std::move()

    简单点理解,c++11 中的std::move() 函数,实际上就是将一个左值强制转换成一个右值引用数据类型,从而可以调用相应的对右值引用重载的函数. 如果使用std::move() 的返回值做为参数 ...

  5. windows下安装jenkins初级(1)

    这里是基于Windows系统下安装Jenkins 首先下载jenkins 下载地址:https://jenkins.io/download/ 选择所需要的系统 我这里选择Windows 开始安装 一直 ...

  6. php漂亮的分页类

    <?php    /*    * PHP分页类    * @package Page    * @Created 2013-03-27    * @Modify  2013-03-27    * ...

  7. 「题解」:07.16NOIP模拟T2:通讯

    问题 B: 通讯 时间限制: 1 Sec  内存限制: 256 MB 题面 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此 ...

  8. NX二次开发-UF_OBJ_cycle_by_name遍历名字

    使用前自己要看好名字是加在body,还是face,还是curve,或者其他,别加错了. NX9+VS2012 #include <uf.h> #include <uf_obj.h&g ...

  9. NX二次开发-UFUN获取点在面上U,V方向的位置UF_MODL_ask_face_parm【转载】

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_modl.h> #include <u ...

  10. [转]设置修改CentOS系统时区

    在我们使用CentOS系统的时候,也许时区经常会出现问题,有时候改完之后还是会出错,下面我们就来学习一种方法来改变这个状况.如果没有安装,而你使用的是 CentOS系统 那使用命令 yum insta ...