zoukankan      html  css  js  c++  java
  • uva 11825

    从最优解的结果考虑,f(s)表示节点集合s最多可分为多少组,如果s中节点及其所连节点的并集是节点的全集的话说明s至少可分为一组,反之,可知f(s)=0,当确定s至少可分一组时,可知其最优解的组成肯定是s的某一子集s0(s0中各节点及其联接的节点的并集为全集且s0只能分成一组否则会造成浪费)+(s-s0),那么f(s)=max{f(s-s0)+1.

    #include <iostream>
    #include <cstdio>
    using namespace std;
    const int maxn=20;
    int n;
    int p[maxn];
    int f[1<<maxn],cover[1<<maxn];
    int max(int a,int b) { return a>b?a:b; }
    int main()
    {
    	int cas=0;
    	while(cin>>n&&n)
    	{  
    		int i,j;
    		int m,v;
    		for(i=0;i<n;i++)
    		{
    			cin>>m;
    			p[i]=1<<i;
    			for(j=0;j<m;j++)
    			{
    				cin>>v;
    				p[i]|=(1<<v);
    			}
    		}
    		for(i=0;i<(1<<n);i++)
    		{
    			cover[i]=0;
    			for(j=0;j<n;j++)
    			{
    				if(i&(1<<j)) cover[i]|=p[j];
    			}
    		}
    		int all=(1<<n)-1;
    		f[0]=0;
    		for(i=1;i<(1<<n);i++)
    		{
    			if(cover[i]==all)
    			{f[i]=1;
    			for(j=(i-1)&i;j;j=(j-1)&i)
    			{
    				if(f[j]==1) f[i]=max(f[i],f[j^i]+1);
    			}
    			}
    			else f[i]=0;
    		}
    		printf("Case %d: %d\n",++cas,f[all]);
    	}
    	return 0;
    }


  • 相关阅读:
    Python 读写
    测试项目总结之手淘安全中心
    Python 单元测试
    Python __name__变量
    java数据类型取值范围
    java数据类型之间的转换
    Git 常用命令清单
    Linux Distribution
    UNIX&Linux发展图谱
    Linux 软件大全
  • 原文地址:https://www.cnblogs.com/lj030/p/3002215.html
Copyright © 2011-2022 走看看