【网络流24题----07】试题库
2017-01-30 08:11
309 查看
«问题描述:
假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算法。
«编程任务:
对于给定的组卷要求,计算满足要求的组卷方案。
«数据输入:
由文件testlib.in提供输入数据。文件第1行有2个正整数k和n (2 <=k<= 20, k<=n<= 1000)k 表示题库中试题类型总数,n 表示题库中试题总数。第2 行有k 个正整数,第i 个正整数表示要选出的类型i 的题数。这k个数相加就是要选出的总题数m。接下来的n行给出了题库中每个试题的类型信息。每行的第1 个正整数p表明该题可以属于p类,接着的p个数是该题所属的类型号。
«结果输出:
程序运行结束时,将组卷方案输出到文件testlib.out 中。文件第i 行输出 “i:”后接类型i的题号。如果有多个满足要求的方案,只要输出1 个方案。如果问题无解,则输出“NoSolution!”。
输入文件示例
testlib.in
3 15
3 3 4
2 1 2
1 3
1 3
1 3
1 3
3 1 2 3
2 2 3
2 1 3
1 2
1 2
2 1 2
2 1 3
2 1 2
1 1
3 1 2 3
输出文件示例
testlib.out
1: 1 6 8
2: 7 9 10
3: 2 3 4 5
和圆桌问题基本一样。
假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算法。
«编程任务:
对于给定的组卷要求,计算满足要求的组卷方案。
«数据输入:
由文件testlib.in提供输入数据。文件第1行有2个正整数k和n (2 <=k<= 20, k<=n<= 1000)k 表示题库中试题类型总数,n 表示题库中试题总数。第2 行有k 个正整数,第i 个正整数表示要选出的类型i 的题数。这k个数相加就是要选出的总题数m。接下来的n行给出了题库中每个试题的类型信息。每行的第1 个正整数p表明该题可以属于p类,接着的p个数是该题所属的类型号。
«结果输出:
程序运行结束时,将组卷方案输出到文件testlib.out 中。文件第i 行输出 “i:”后接类型i的题号。如果有多个满足要求的方案,只要输出1 个方案。如果问题无解,则输出“NoSolution!”。
输入文件示例
testlib.in
3 15
3 3 4
2 1 2
1 3
1 3
1 3
1 3
3 1 2 3
2 2 3
2 1 3
1 2
1 2
2 1 2
2 1 3
2 1 2
1 1
3 1 2 3
输出文件示例
testlib.out
1: 1 6 8
2: 7 9 10
3: 2 3 4 5
和圆桌问题基本一样。
#include<iostream> #include<cstdio> #include<algorithm> #include<vector> #include<cstdlib> #include<cmath> #include<cstring> using namespace std; #define maxn 1101 #define llg int #define inf (llg)1e16 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); llg n,m,r[maxn],c[maxn],N,tot,k; struct DINIC { vector<llg>a[maxn],ba[maxn],val[maxn]; llg dl[maxn],deep[maxn],bj[maxn]; void insert(llg x,llg y,llg z) { a[x].push_back(y),val[x].push_back(z); a[y].push_back(x),val[y].push_back(0); ba[x].push_back(a[y].size()-1); ba[y].push_back(a[x].size()-1); } llg dfs(llg x,llg low) { llg va=0,inc=0; if (x==N) return low; llg w=a[x].size(); for (llg i=0;i<w;i++) if (deep[x]+1==deep[a[x][i]] && val[x][i]>0 && (va=dfs(a[x][i],min(low,val[x][i])))) { val[x][i]-=va; val[a[x][i]][ba[x][i]]+=va; inc+=va; return va; } if (!inc) deep[x]=-1; return 0; } void fencen() { llg x,w,v; deep[0]=0; memset(bj,0,sizeof(bj)); llg head=0,tail=1; dl[1]=0; bj[0]=1; do { x=dl[++head]; w=a[x].size(); for (llg i=0;i<w;i++) { v=a[x][i]; if (bj[v] || val[x][i]<=0) continue; dl[++tail]=v; deep[v]=deep[x]+1; bj[v]=1; } }while (head!=tail); } llg dinic() { llg ans=0; while (1) { fencen(); if (!bj ) break; ans+=dfs(0,inf); } return ans; } void oupt() { for (llg i=1;i<=k;i++) { printf("%d: ",i); llg w=a[i].size(); for (llg e=0;e<w;e++) { llg v=a[i][e]; if (v>k && v<N && val[i][e]==0) printf("%d ",v-k); } printf("\n"); } } }G; void init() { llg x,p; cin>>k>>n; for (llg i=1;i<=k;i++) { scanf("%d",&x); G.insert(0,i,x); tot+=x; } for (llg j=1;j<=n;j++) { scanf("%d",&p); for (llg i=1;i<=p;i++) { scanf("%d",&x); G.insert(x,k+j,1); } G.insert(k+j,k+n+1,1); } N=n+k+1; } int main() { yyj("testlib"); init(); if (G.dinic()==tot) { // puts("1"); G.oupt(); } else { puts("NoSolution!"); } return 0; }
相关文章推荐
- 732. [网络流24题] 试题库 费用流/最大最小值
- 「网络流 24 题」试题库
- 线性规划与网络流24题 07试题库问题
- 线性规划与网络流24——试题库问题
- LOJ6006「网络流 24 题 - 7」 试题库 坠大流
- Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)
- loj6006「网络流 24 题」试题库(最大流)
- 【线性规划与网络流24题 7】试题库问题
- COGS732. [网络流24题] 试题库
- Cogs 732. [网络流24题] 试题库(二分图)
- liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案
- 【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)
- loj 6006「网络流 24 题」试题库
- [网络流24题 #7]试题库问题
- 「网络流 24 题」试题库
- COGS 732. [网络流24题] 试题库
- 【loj】#6006. 「网络流 24 题」试题库(二分图匹配)
- 【网络流24题】试题库(二分图+最大流)
- cogs 732. [网络流24题] 试题库
- 费用流[网络流24题] 餐巾