比赛 20120417 评测结果 AAAAAATTTAATAATAA
题目名称 牛棚的灯 最终得分 70
用户昵称 Makazeu 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-17 11:21:30
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define MAXN 40
using namespace std;
typedef long long LL;
int Mat[MAXN][MAXN];
int N,M,max;
class Kaaala {public:int id,num;}K[MAXN];
inline bool cmp(const Kaaala&a,const Kaaala&b) {return a.num>b.num;}
LL binary[MAXN];
LL Sta;
int Ans,res;

inline int Min(int a,int b) {return a<b?a:b;}

void dfs(int now)
{
	if(!Sta) 
	{
		Ans=Min(Ans,res); 
		return;
	}
	if(now>N || res+1>=Ans) return;	
	dfs(now+1);
	res++;
	Sta=Sta^(binary[K[now].id]);
	dfs(now+1); 
	Sta=Sta^(binary[K[now].id]);
	res--;
}

void init()
{
	scanf("%d %d\n",&N,&M); int x,y;
	memset(Mat,0,sizeof(Mat));  Sta=((1LL)<<N)-1;
	for(int i=1;i<=N;i++) {Mat[i][i]=1; K[i].id=i;}
	for(int i=1;i<=M;i++)
	{
		scanf("%d %d\n",&x,&y);
		Mat[x][y]=1,Mat[y][x]=1;
		K[x].num++;  K[y].num++;
	}
	sort(K+1,K+N+1,cmp);
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=N;j++)
		{
			binary[i]=binary[i]<<1;
			if(Mat[i][j]) binary[i]++;
		}
	}
}

int main()
{
	freopen("lights.in","r",stdin);
	freopen("lights.out","w",stdout);
	init();
	Ans=Min(N+1,1<<4);
	dfs(1);
	printf("%d\n",Ans);
	return 0;
}