记录编号 24615 评测结果 AAAAAAAAAAAAAAAAA
题目名称 牛棚的灯 最终得分 100
用户昵称 Gravatar.Xmz 是否通过 通过
代码语言 C++ 运行时间 0.010 s
提交时间 2011-04-12 20:11:41 内存使用 0.26 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>

using namespace std;

int n,m,ans,now;
bool y[41][41];
long long sta[41];
void init()
{
	scanf("%d%d",&n,&m);
	int a,b;
	for (;m;--m)
	{
		scanf("%d%d",&a,&b);
		y[a][b]=y[b][a]=true;
	}
	for (int i=1;i<=n;i++)
	{	
		y[i][i]=true;
		y[i][0]=true;
	}
}

void XO(int a,int b)
{
	for (int i=0;i<=n;i++)
		y[a][i]^=y[b][i];
}

void dfs(int u)
{
	if (now>=ans) return;
	if (u==0)
	{
		ans=min(ans,now);
	}
	else if (y[u][u])
	{
		now+=((sta[0]>>u) & 1);
		dfs(u-1);
		now-=((sta[0]>>u) & 1);
	}
	else
	{
		dfs(u-1);
		sta[0]^=sta[u];
		now++;
		dfs(u-1);
		now--;
		sta[0]^=sta[u];
	}
}

void solve()
{
	for (int i=1;i<=n;i++)
	{
		for (int j=i;j<=n;j++)
		{
			if (y[j][i])
			{
				for (int k=0;k<=n;k++)
					swap(y[i][k],y[j][k]);
				goto en;
			}
		}
		continue;
		en:;
		for (int j=1;j<=n;j++)
		if (i!=j && y[j][i])
		XO(j,i);
	}
	for (int i=1;i<=n;i++)
	{
		for (int j=0;j<=n;j++)
		if (y[i][j])
			sta[j]+=1<<i;
	}
	ans=100;
	dfs(n);
	printf("%d\n",ans);
}

int main()
{
	freopen("lights.in","r",stdin);
	freopen("lights.out","w",stdout);
	init();
	solve();
	return 0;
}