题目描述
«问题描述:
假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算法。
«编程任务:
对于给定的组卷要求,计算满足要求的组卷方案。
输入输出格式
输入格式:
第1行有2个正整数k和n (2 <=k<= 20, k<=n<= 1000)
k 表示题库中试题类型总数,n 表示题库中试题总数。第2 行有k 个正整数,第i 个正整数表示要选出的类型i的题数。这k个数相加就是要选出的总题数m。接下来的n行给出了题库中每个试题的类型信息。每行的第1 个正整数p表明该题可以属于p类,接着的p个数是该题所属的类型号。
输出格式:
第i 行输出 “i:”后接类型i的题号。如果有多个满足要求的方案,只要输出1个方案。如果问题无解,则输出“No Solution!”。
输入输出样例
输入样例#1:
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
输出样例#1:
1: 1 6 8 2: 7 9 10 3: 2 3 4 5
说明
感谢 @PhoenixEclipse 提供spj
解题思路
把试题库类型抽象成点1~k,试题抽象为点k+1~n,然后从源点到1~k的容量为该试题类型数,k+1~n到汇点的容量为1。若试题x属于类型y,就让y到x的容量为1。所以反向弧设为0。然后用dinic算法求最大流。如果最大流小于所需总试题量,就输出“No Solution!”,否则,为0的正向弧(u,v)就表示选择了v作为u类型的题来出题了。按类型输出即可。
代码如下