求解一道acm,谢谢
Description
给定一个实例I = (X , F),X为一个有限集合,F为X的子集的集合,使得X中的每个元素至少属于F中的一个元素,则认为子集F覆盖了X的元素。
集合覆盖问题就是,找出含X的子集个数最少的子集C属于F,使得C覆盖了X中的所有元素。
如X = {0,1,2,3,4,5,6,7,8,9,10,11} , F = {S1,S2,S3,S4,S5,S6},
S0 = {0,1,2,3,4,5}, S1 = {4,5,7,8} , S2 = {0,3,6,9} ,
S3 = {1,4,6,7,10} , S4 = {2,5,8,11}, S5 = {9,10}。
其最小的集合覆盖C={S2,S3,S4}
Input
第一行有2个正整数n和m,(1 <= n <= 6000 , 1 <= m <= 600)分别表示有限集X中元素个数和子集族F中子集个数。X = {0,1,, n -1}, F = {S1,S2 , ... ,Sm-1}。
接下来的m行中,每行对应F中一个子集Si。第一个数是子集Si中元素个数ki,接着的ki个数表示Si中的元素。
Output
输出第一行表示最小的覆盖数C*,(设最优解为C,C*在范围[C , 1.84 * C]内即可)。我们的输入保证存在解。
第二行有C*个整数,表示最小的覆盖子集(子集可以任意序列输出,但不能有重复的数,两个数间用空格隔开)。