当前位置:   article > 正文

集合覆盖_集合覆盖模型

集合覆盖模型

问题提出

例:设集合S={a,b,c,d,e,f},P={A1,A2,A3,A4},A1={a,b,c,d},A2={d,e,f},A3={a,e,f}

请找出一个Ai的集合C,使C覆盖S中的所有元素,如C={A1,A2}

可以使用贪心算法首先找出能覆盖最多S元素的Ai,然后将覆盖的元素移除S,P移除Ai,最后将Ai插入C,依次...直至S元素全部被覆盖,或Ai不足以覆盖S

  1. #include <stdlib.h>
  2. #include "cover.h"
  3. #include "list.h"
  4. #include "set.h"
  5. int cover(Set *members, Set *subsets, Set *covering) {
  6. Set intersection;
  7. KSet *subset;
  8. ListElmt *member,
  9. *max_member;
  10. void *data;
  11. int max_size;
  12. set_init(covering, subsets->match, NULL);
  13. while(set_size(members) > 0 && set_size(subsets) > 0) {
  14. max_size = 0;
  15. for (member = list_head(subsets); member != NULL; member = list_next(member)) {
  16. if (set_intersection(&intersection, &(KSet *)list_data(member))->set, members) != 0) {
  17. return -1;
  18. }
  19. if (set_size(&intersection) > max_size) {
  20. max_member = member;
  21. max_size = set_size(&intersection);
  22. }
  23. set_destroy(&intersection);
  24. }
  25. if (max_size == 0)
  26. return 1;
  27. subset = (KSet *)list_data(max_member);
  28. if (set_insert(covering, subset) != 0)
  29. return -1;
  30. for (member = list_head(&((KSet *)list_data(max_member))->set); member != NULL; member = list_next(member)) {
  31. data = list_data(member);
  32. if (set_remove(member, (void**)&data) == 0 && member->destroy != NULL) {
  33. members->destroy(data);
  34. }
  35. if (set_remove(subsets, (void**)&subset) != 0)
  36. return -1;
  37. }
  38. }
  39. if (set_size(members) > 0)
  40. return -1;
  41. return 0;
  42. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/487543
推荐阅读
相关标签
  

闽ICP备14008679号