Hackers' Crackdown

来源:互联网 发布:编程笔记本推荐 编辑:程序博客网 时间:2024/06/05 20:23

题意:

把n个集合分成尽量多组,使每组中所有集合的并集为全集.

#include<cstdio>#include<algorithm>#include<string>#include<cstring>using namespace std;const int maxn = 1<<17;int ans[maxn], cover[maxn];int node[20];int n;int main() {int C=0;while(scanf("%d", &n) && n) {int m, t;for(int j=0; j<n; j++) {node[j] = 1<<j;//自己也包含在里面scanf("%d", &m);for(int i=0; i<m; i++) {scanf("%d", &t);node[j] |= 1<<t;//与其相邻的计算机置为1}}int maxs = (1<<n)-1, s, s0;for(s=1; s<=maxs; s++) {//集合组合方式cover[s]=0;for(int j=0; j<n; j++) if(s & (1<<j))//组合包含第j个集合才能含有第j个集合的元素.cover[s] |= node[j];}for(s=1; s<=maxs; s++) {ans[s]=0;for(s0=s; s0; s0=(s0-1)&s) {//s0为s的子集if(cover[s0]==maxs) ans[s] = max(ans[s], ans[s^s0]+1);//s0包含所有的计算机时才执行, s^s0是s0从s里面分出一个组,所以+1.}}printf("Case %d: %d\n",++C,ans[s-1]);}return 0;}


0 0
原创粉丝点击