P2763 试题库问题 (网络流 最大流)
解题思路
比较简单的网络流,建图还是比较好想的。让源点向试题连流量为1的边,试题向所属类型连流量为1的边,类型向汇点连流量为需要此类试题的边。直接跑最大流,输出答案时找到那些满流的边所对的点。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- #include<vector>
- using namespace std;
- const int MAXN = ;
- const int MAXM = ;
- const int inf = 0x3f3f3f3f;
- inline int rd(){
- int x=,f=;char ch=getchar();
- while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
- while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
- return f?x:-x;
- }
- int k,n,head[MAXN],cnt=,d[MAXN],sum,Sum;
- int S=,T=,to[MAXM<<],nxt[MAXM<<],val[MAXM<<];
- queue<int> Q;vector<int> ans[MAXN];
- inline void add(int bg,int ed,int w){
- to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt;
- }
- bool bfs(){
- while(Q.size()) Q.pop();memset(d,,sizeof(d));
- d[S]=;Q.push(S);
- while(!Q.empty()){
- int x=Q.front();Q.pop();
- for(register int i=head[x];i;i=nxt[i]){
- int u=to[i];
- if(!d[u] && val[i]) {
- d[u]=d[x]+;Q.push(u);
- if(u==T) return true;
- }
- }
- }
- return false;
- }
- int dinic(int x,int flow){
- if(x==T) return flow;
- int res=flow,k;
- for(register int i=head[x];i && res;i=nxt[i]){
- int u=to[i];
- if(d[u]==d[x]+ && val[i]){
- k=dinic(u,min(flow,val[i]));
- if(!k) d[u]=;
- val[i]-=k;val[i^]+=k;res-=k;
- }
- }
- return flow-res;
- }
- int main(){
- k=rd(),n=rd();int x,y;
- for(int i=;i<=k;i++)
- x=rd(),add(i,T,x),add(T,i,),Sum+=x;
- for(int i=;i<=n;i++){
- x=rd();
- for(int j=;j<=x;++j){
- y=rd();add(i+k,y,);add(y,i+k,);
- }
- }
- for(int i=;i<=n;i++) add(S,i+k,),add(i+k,S,);
- while(bfs()) sum+=dinic(S,inf);
- // cout<<sum<<endl;
- for(int i=;i<=k;i++)
- for(int j=head[i];j;j=nxt[j]){
- if(to[j]==T) continue;
- if(!val[j^]) ans[i].push_back(to[j]-k);
- }
- for(int i=;i<=k;i++){
- printf("%d: ",i);
- for(int j=;j<ans[i].size();j++) printf("%d ",ans[i][j]);
- printf("\n");
- }
- return ;
- }
P2763 试题库问题 (网络流 最大流)的更多相关文章
- 【题解】 P2763 试题库问题(网络流)
P2763 试题库问题 考虑一个试题要被加入进答案的集合有什么条件? 是某种类型 只算作一次 就这两种且的限制,所以我们用串联的方式连接"类型点"和"作用点". ...
- 洛谷P2763 试题库问题(最大流)
传送门 网络流界的一股清流啊……终于没那么变态了…… 考虑一下怎么建图.对于每一个类型,我们从$S$向他连边,容量为它所需的题数,表明它要可以有这么多题,对于每一道题目,我们从它对应的类型向他连边,容 ...
- 洛谷 P2763 试题库问题【最大流】
s向所有类别属性连流量为当前类别属性需要的个数的边,所有题目向t连流量为1的边(表示只能选一次),所有属性向含有它的题连容量为1的边.跑一变dinic,结果小于m则无解,否则看每一个类别属性连出去的题 ...
- P2763 试题库问题(dinic)
P2763 试题库问题 dinic 搞个虚拟源点和汇点,瞎建建边就好辣. 偷张图↓↓ 如果没满流就是无解辣 输出方案咋办呢? 枚举每种类型,蓝后枚举它们的边 如果该边被使用了(通过判断反向边的流量), ...
- 【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)
[题意] 假设一个试题库中有 n 道试题. 每道试题都标明了所属类别. 同一道题可能有多个类别属性.现要从题库中抽取 m 道题组成试卷.并要求试卷包含指定类型的试题. 试设计一个满足要求的组卷算法. ...
- 洛谷 P2763 试题库问题(网络流24题之一)
题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...
- 网络流问题 P2763 试题库问题
题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...
- 【洛谷 P2763】 试题库问题(最大流)
题目链接 6/23 这是网络流23题里我第一个没看题解自己写出来一遍过的.. 这题应该是最简单的模型了吧. 从源点向每个类型连一条流量为这个类型要的题数,再从每个类型向可以属于这个类型的所有试题连一条 ...
- 洛谷P2763 试题库问题(最大流)
题意 $n$道试题,每道题有多种类别属性 抽取$m$道题组成试卷,要求包含指定的类型 输出方案 Sol 又是一道zz网络流 我的构图长这样,$k_i$表示第$i$道试题需要的数量 #include&l ...
随机推荐
- iOS录音后播放声音变小的解决方法
目前需求是录音之后再播放出来.经常会出现播放声音变很小的情况. 解决方法: if (recorder.recording){ [recorder stop]; } [[AVAudioSession s ...
- 个人使用Viso绘制的简单神经网络实现原理图
- Linux 档案目录的结构及功能(鸟哥私房菜)
- c++11 std::move()
简单点理解,c++11 中的std::move() 函数,实际上就是将一个左值强制转换成一个右值引用数据类型,从而可以调用相应的对右值引用重载的函数. 如果使用std::move() 的返回值做为参数 ...
- windows下安装jenkins初级(1)
这里是基于Windows系统下安装Jenkins 首先下载jenkins 下载地址:https://jenkins.io/download/ 选择所需要的系统 我这里选择Windows 开始安装 一直 ...
- php漂亮的分页类
<?php /* * PHP分页类 * @package Page * @Created 2013-03-27 * @Modify 2013-03-27 * ...
- 「题解」:07.16NOIP模拟T2:通讯
问题 B: 通讯 时间限制: 1 Sec 内存限制: 256 MB 题面 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此 ...
- NX二次开发-UF_OBJ_cycle_by_name遍历名字
使用前自己要看好名字是加在body,还是face,还是curve,或者其他,别加错了. NX9+VS2012 #include <uf.h> #include <uf_obj.h&g ...
- NX二次开发-UFUN获取点在面上U,V方向的位置UF_MODL_ask_face_parm【转载】
NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_modl.h> #include <u ...
- [转]设置修改CentOS系统时区
在我们使用CentOS系统的时候,也许时区经常会出现问题,有时候改完之后还是会出错,下面我们就来学习一种方法来改变这个状况.如果没有安装,而你使用的是 CentOS系统 那使用命令 yum insta ...