【题解】 P2763 试题库问题(网络流)
P2763 试题库问题
考虑一个试题要被加入进答案的集合有什么条件?
- 是某种类型
- 只算作一次
就这两种且的限制,所以我们用串联的方式连接"类型点"和"作用点"。
判断无解就判断容量是否满了。输出方案就输出有流量的边的终点。
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int inf=0x3f3f3f3f;
const int maxn=1.9e3+5;
int nodecnt;
struct E{
int to,nx,w;
}e[50005];
int head[maxn];
int cur[maxn];
int d[maxn];
int cnt=-1,S,T,n,m,k;
vector< int > ve[maxn];
inline void add(const int&fr,const int&to,const int&w,const int&f){
//printf("fr=%d to=%d w=%d cnt=%d\n",fr,to,w,cnt);
e[++cnt]={to,head[fr],w};
head[fr]=cnt;
if(f)add(to,fr,0,0);
}
queue< int >q;
inline bool bfs(){
for(register int t=1;t<=n+k+2;++t) cur[t]=head[t],d[t]=0;
q.push(S);
d[S]=1;
while(!q.empty()){
register int now=q.front();
q.pop();
if(now==T)continue;
for(register int t=head[now];t!=-1;t=e[t].nx){
if(!d[e[t].to]&&e[t].w>0){
d[e[t].to]=d[now]+1;
q.push(e[t].to);
}
}
}
return d[T];
}
int dfs(const int&now,const int&last,int fl){
if(now==T||fl==0)return fl;
register int ret=0;
for(register int&t=cur[now];t!=-1;t=e[t].nx){
if(e[t].w>0&&d[e[t].to]==d[now]+1&&fl){
int d=dfs(e[t].to,now,min(fl,e[t].w));
e[t].w-=d;e[t^1].w+=d;ret+=d;fl-=d;
}
}
return ret;
}
inline int dinic(){
register int ret=0;
while(bfs()) ret+=dfs(S,0,inf);
return ret;
}
int main(){
freopen("testlib.in","r",stdin);
freopen("testlib.out","w",stdout);
memset(head,-1,sizeof head);
k=qr();n=qr();
S=1;T=k+n+2;
for(register int t=1;t<=k;++t)
add(S,t+1,qr(),1);
for(register int t=1,t1;t<=n;++t){
t1=qr();
for(register int i=1;i<=t1;++i)
add(qr()+1,t+k+1,1,1);
add(t+k+1,T,1,1);
}
dinic();
int ok=1;
for(register int t=head[S];t!=-1;t=e[t].nx)
if(e[t].w) ok=0;
if(ok) {
//printf("%d\n",f);
for(register int now=2;now<=k+1;++now){
printf("i:%d ",now-1);
for(register int t=head[now];t!=-1;t=e[t].nx)
if(e[t].to!=1&&e[t].w==0)
printf("%d ",e[t].to-k-1);
putchar('\n');
}
}
else puts("No Solution!");
return 0;
}
【题解】 P2763 试题库问题(网络流)的更多相关文章
- P2763 试题库问题 (网络流 最大流)
传送门 解题思路 比较简单的网络流,建图还是比较好想的.让源点向试题连流量为1的边,试题向所属类型连流量为1的边,类型向汇点连流量为需要此类试题的边.直接跑最大流,输出答案时找到那些满流的边所对的点. ...
- P2763 试题库问题(dinic)
P2763 试题库问题 dinic 搞个虚拟源点和汇点,瞎建建边就好辣. 偷张图↓↓ 如果没满流就是无解辣 输出方案咋办呢? 枚举每种类型,蓝后枚举它们的边 如果该边被使用了(通过判断反向边的流量), ...
- 网络流问题 P2763 试题库问题
题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...
- 洛谷 P2763 试题库问题(网络流24题之一)
题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...
- 【题解】Luogu P2763 试题库问题
原题传送门 这题很简单啊 从源点向k类题目分别连流量为所需数量的边 从每道题向汇点连一条流量为1的边(每题只能用1次) 从类型向对应的题目连一条流量为1的边 跑一遍最大流 如果最大流小于所需题目数量, ...
- [洛谷P2763]试题库问题
题目大意:有 $k$ 种类型和 $n$ 个题目,每个题目会适应部分类型,第$i$个类型需要$s_i$的题,一道题只能满足一种类型,现要求出满足所有类型的题目的方案 题解:看到匹配,想到网络流,源点向试 ...
- 洛谷P2763 试题库问题(最大流)
题意 $n$道试题,每道题有多种类别属性 抽取$m$道题组成试卷,要求包含指定的类型 输出方案 Sol 又是一道zz网络流 我的构图长这样,$k_i$表示第$i$道试题需要的数量 #include&l ...
- 洛谷P2763 试题库问题(最大流)
传送门 网络流界的一股清流啊……终于没那么变态了…… 考虑一下怎么建图.对于每一个类型,我们从$S$向他连边,容量为它所需的题数,表明它要可以有这么多题,对于每一道题目,我们从它对应的类型向他连边,容 ...
- P2763 试题库问题
传送门 显然的网络流,源点向所有题目连流量为1的边,表示一题只能用一次,题目向它的所有类型连边,流量设为1,类型向汇点连边流量为题目需要的该类型的数量 然后最大流 如果最大流小于总需要的类型题目数量则 ...
随机推荐
- 在SAE上使用Flask插件
因为我之前学习的时候使用的是虚拟环境,下载的所有需要用到的插件都在flask这个文件夹里面,SAE上Flask的版本和我本地用的版本对不上,导致有时候import都不对,于是我就把本地的环境直接放到S ...
- @loj - 2674@ 「NOI2012」美食节
目录 @description@ @solution@ @accepted code@ @details@ @description@ CZ 市为了欢迎全国各地的同学,特地举办了一场盛大的美食节. 作 ...
- 在线url网址编码、解码
>>在线url网址编码.解码<<
- mysql数据库之单表查询
单标查询 单表查询语句 关键字执行的优先级 简单查询 where约束 group by 聚合函数 HAVING过滤 order by 查询排序 LIMIT限制查询的记录数 使用正则表达式查询 单表查询 ...
- shell awk杂项
awk '{ ;++i<=NF;){ a[i]=a[i]?a[i]",'\''"$i"'\''":"'\''"$i"'\'' ...
- phpStudy本地环境测试,打开网页很慢的解决办法!
很多人应该都遇到了在使用phpStudy本地环境测试软件时候打开很慢的问题,甚至动辄达到了1000ms以上,开篇直接给出解决办法: 下面给大家介绍phpstudy访问速度慢的解决办法. 1.修改mys ...
- 深入Java线程管理(三):线程同步
一. 引入同步: 有一个很经典的案例,即银行取款问题.我们可以先看下银行取款的基本流程: 1)用户输入账户.密码,系统判断用户的账户.密码是否匹配. 2)用户输入取款金额. 3)系统判断账户金额是否大 ...
- js常见错误类型及chrome常见报错(更新中)
ECMA-262 定义了下列 7 种错误类型: 1.Error 错误 2.EvalError 全局错误 eval函数没有正确执行 3.RangeError 范围错误 4.ReferenceError ...
- 使用Fiddler抓取微信饿了么小程序数据
使用Fiddler抓取微信饿了么小程序数据 准备 一部装载Android 7.0以下的手机:此处使用华为荣耀5x 微信小程序7.0以下版本:此处为6.6.7.此处可通过豌豆荚应用下载. 安装好的Fid ...
- java TreeSet的排序之定制排序
TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了: 该接口包含int compare(Object o1,Object o2 ...