比赛 |
20110412pm |
评测结果 |
AAAAAAAAATTTTTTTT |
题目名称 |
牛棚的灯 |
最终得分 |
52 |
用户昵称 |
.Xmz |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-04-12 17:01:41 |
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>
using namespace std;
int n,m,ans;
bool y[41][41];
bool can[41];
bool ty[41][41];
int tn[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,int now)
{
if (u>n)
{
int t=now;
for (int i=1;i<=n;i++)
if (y[i][0] && tn[i]==0) return;
for (int i=1;i<=n;i++)
if (y[i][0]) ++t;
ans=min(ans,t);
return ;
}
if (can[u]) dfs(u+1,now);
else
{
for (int i=1;i<=n;i++)
if (ty[i][u])
{
if (y[i][u])--tn[i];
y[i][u]=false;
y[i][0]=!y[i][0];
}
dfs(u+1,now+1);
for (int i=1;i<=n;i++)
if (ty[i][u])
{
if (y[i][u])--tn[i];
y[i][u]=false;
y[i][0]=!y[i][0];
}
dfs(u+1,now);
}
}
void solve()
{
int now;
for (int i=1;i<=n;i++)
{
for (now=1;!y[i][now] && now<=n;now++);
if (now>n) break;
can[now]=true;
for (int j=1;j<=n;j++)
if (i!=j && y[j][now])
XO(j,i);
}
ans=100;
for (int T=1;T<=n;T++)
{
for (int i=1;i<=n;i++)
{
int num=0,k=0;
for (int j=1;j<=n;j++)
{
if (y[i][j]) ++num,k=j;
}
if (num==1)
{
can[k]=true;
for (int j=1;j<=n;j++)
if (i!=j && y[j][k])
{
y[j][k]=false;
y[j][0]^=y[i][0];
}
}
}
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (y[i][j]) tn[i]++;
memcpy(ty,y,sizeof(y));
dfs(1,0);
printf("%d\n",ans);
}
int main()
{
freopen("lights.in","r",stdin);
freopen("lights.out","w",stdout);
init();
solve();
return 0;
}