C語言 Set 案例

2021-07-28 13:29:58 字數 1345 閱讀 3761

集合覆蓋是乙個組合數學和資源選擇的問題模型,主要思想是:

給定乙個集合s, a1

...a

n 為s的子集所組成的集合p,集合c就是由來自p的乙個或多個集合組成。集合c覆蓋s是指,如果s中的每乙個元素都至少包含在乙個c的子集中。此外,c包含的來自p的子集越少越好。

#include

#include

#include

"cover.h"

#include

"list.h"

#include

"set.h"

/* 從所給的子集的集合subsets中尋找最小的子集組合covering,使其能夠覆蓋全集members */

/* args:

members: 所要覆蓋的目標集合

subsets: 由members的子集所組成的集合

covering: 尋找的最小子集集合

method:

每次從subsets中尋找最大覆蓋率的子集,找到後加入到covering集合,

從members中刪除已覆蓋的元素,從subsets從刪除已加入到covering中的子集元素

*/int cover(set

*members, set

*subsets, set

*covering)

if(set_size(&intersection) > max_size)

/* 只是尋找覆蓋率最大的子集,並不使用交集 */

set_destroy(&intersection);

}//交集為空,說明無法覆蓋餘下的members元素,因此cover失敗

if(max_size ==

0) return

1; //對找到的最大覆蓋率子集進行處理

subset = (kset *)list_data(max_member);

//step1: 將子集加入到covering中

if(set_insert(covering, subset) !=

0) return-1;

//從members,subsets中刪除子集元素

for(member = list_head(&((kset *)list_data(max_member))->

set); member !=

null; member = list_next(member))

}//如果沒覆蓋完,則表明無法覆蓋

if(set_size(members) >

0) return-1;

return

0;}

C語言案例

1.水仙花數code include int main void printf 100 999有 d個水仙花數 count 2.兩個時間只差 include int main void if year1 year2 if month1 month2 第一年的是這年的多少天 switch month1...

C 語言之set用法

下面簡單總結下set容器的操作 1 set物件的定義和初始化 set物件的定義和初始化方法包括 sets sets s1 sets b,e 其中,b和e分別為迭代器的開始和結束的標記。例如 include include include using namespace std int main se...

c語言迴圈案例

do while include include int main while b 0 printf d n b 8 return 0 不管條件是否滿足都執行一次。模擬dos遊戲。include include int main while choice 1 choice 3 switch choi...