集合覆盖
来源:互联网 发布:数据,模型与决策 编辑:程序博客网 时间:2024/05/19 23:13
问题提出
例:设集合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
#include <stdlib.h>#include "cover.h"#include "list.h"#include "set.h"int cover(Set *members, Set *subsets, Set *covering) { Set intersection; KSet *subset; ListElmt *member, *max_member; void *data; int max_size; set_init(covering, subsets->match, NULL); while(set_size(members) > 0 && set_size(subsets) > 0) { max_size = 0; for (member = list_head(subsets); member != NULL; member = list_next(member)) { if (set_intersection(&intersection, &(KSet *)list_data(member))->set, members) != 0) { return -1; } if (set_size(&intersection) > max_size) { max_member = member; max_size = set_size(&intersection); } set_destroy(&intersection); } if (max_size == 0) return 1; subset = (KSet *)list_data(max_member); if (set_insert(covering, subset) != 0) return -1; for (member = list_head(&((KSet *)list_data(max_member))->set); member != NULL; member = list_next(member)) { data = list_data(member); if (set_remove(member, (void**)&data) == 0 && member->destroy != NULL) { members->destroy(data); } if (set_remove(subsets, (void**)&subset) != 0) return -1; } } if (set_size(members) > 0) return -1; return 0;}
- 集合覆盖
- 集合覆盖
- 集合覆盖模型
- 集合的应用----集合覆盖分析
- 8、集合应用-集合覆盖问题
- 防止覆盖集合中的数据
- 【NPC】15、顶点覆盖规约到集合覆盖
- Set Cover Problem (集合覆盖问题)
- 贪婪算法近似集合覆盖问题的解
- 集合覆盖问题、最大覆盖问题、呼叫中心排班问题闲谈
- 集合覆盖问题、最大覆盖问题、呼叫中心排班问题闲谈
- 覆盖
- 覆盖
- 覆盖
- 覆盖
- 覆盖
- 覆盖
- set集合 HashSet: TreeSet实现Comparable接口,覆盖compareTo方法。 类实现Comparator接口,覆盖compare方法。
- Fstream学习1-OPEN
- 一篇不错的讲解Java异常的文章(转载)
- 原创 ICMP报文校验和的计算及各种网络报文结构
- mongoDB之入门二
- dedecms代码详解(5)
- 集合覆盖
- VIX API Concepts : Callback Functions
- dedecms代码详解(6)
- HDU 4294 or POJ 2283
- PHP文件上传
- 等待是我不可更改的宿命_伤感日志
- spring quartz定时程序
- dedecms代码详解(7)最后
- 获取Android状态栏的高度