求解一道acm,谢谢

chaojiew 2012-06-27 08:27:24
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*个整数,表示最小的覆盖子集(子集可以任意序列输出,但不能有重复的数,两个数间用空格隔开)。
...全文
104 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2012-06-27
  • 打赏
  • 举报
回复
问题本身是NPC的,这也是为什么题目只需要求近似解。
这个问题有趣的地方在于它已经被证明了没有0.72*log(n)以内的确定性多项式算法(对应上面的1.84)。如果数据不强的话当然直接用贪心看看能不能a。a不掉的话那就需要随机化了。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧