记录编号 451403 评测结果 AAAAAAAAAAAAAAAAA
题目名称 牛棚的灯 最终得分 100
用户昵称 GravatarAnonymity 是否通过 通过
代码语言 C++ 运行时间 0.009 s
提交时间 2017-09-17 16:42:13 内存使用 0.32 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <cstring>
#define maxn 40
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int read()
{   char c=getchar();int x=0,y=1;
    while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*y;
}
template<typename T>
inline T m_min(T x,T y){return x<y?x:y;}
int n,m,A[maxn][maxn],ans[maxn],cnt,fans=0x7fffffff;
inline void dfs(int x)
{	if(cnt>=fans) return;
	if(!x){fans=m_min(fans,cnt);return;}
	if(A[x][x])
	{	bool now=A[x][n+1];
		for(int i=x+1;i<=n;++i)
			if(A[x][i]) now^=ans[i];
		ans[x]=now;
		if(now) ++cnt;
		dfs(x-1);
		if(now) --cnt;
	}
	else
	{	++cnt;ans[x]=1;dfs(x-1);
		--cnt;ans[x]=0;dfs(x-1);
	}
}
void gs()
{	for(int i=1;i<=n;++i)
	{	int tmp=i;
		while(tmp<=n&&!A[tmp][i]) ++tmp;
		if(tmp>n) continue;
		if(i!=tmp) for(int k=1,edg=n+1;k<=edg;++k) swap(A[i][k],A[tmp][k]);
		for(int j=1;j<=n;++j)
			if(i!=j&&A[j][i])
				for(int k=1,edg=n+1;k<=edg;++k) A[j][k]^=A[i][k];
	}
}
int main()
{	freopen("lights.in","r",stdin);
	freopen("lights.out","w",stdout);
	n=read();m=read();int x,y;
	for(int i=1;i<=n;++i) A[i][i]=A[i][n+1]=1;
	for(int i=1;i<=m;++i)
		x=read(),y=read(),A[x][y]=1,A[y][x]=1;
	gs();dfs(n);
	printf("%d",fans);
}