记录编号 |
176097 |
评测结果 |
AAAAAAAAAAAAAAAAA |
题目名称 |
牛棚的灯 |
最终得分 |
100 |
用户昵称 |
stdafx.h |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.063 s |
提交时间 |
2015-08-07 21:20:06 |
内存使用 |
0.29 MiB |
显示代码纯文本
#define MAXN 80UL
#define MAXE 2000UL
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
bitset<MAXN> p[MAXN];
struct Edge{
int v,nx;
};
Edge edge[MAXE];
int ec,n,m,headlist[MAXN],a,b,Ans,state[MAXN];
void Add_Edge(int u,int v){
edge[++ec].v=v;
edge[ec].nx=headlist[u];
headlist[u]=ec;
return;
}
int Cal(int f,int t){
if(f==t){
return 1;
}
for(int i=headlist[f];i;i=edge[i].nx){
if(edge[i].v==t){
return 1;
}
}
return 0;
}
void dfs(int k,int cnt){
if(cnt>=Ans){
return;
}
if(k==0){
if(cnt<Ans){
Ans=cnt;
}
}
if(p[k][k]){
int h=p[k][n+1];
for(int i=k+1;i<=n;i++){
if(p[k][i]){
h^=state[i];
}
}
state[k]=h;
if(h){
dfs(k-1,cnt+1);
}
else{
dfs(k-1,cnt);
}
}
else{
state[k]=0;dfs(k-1,cnt);
state[k]=1;dfs(k-1,cnt+1);
state[k]=0;
}
return;
}
int main(){
freopen("lights.in","r",stdin);
freopen("lights.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
Add_Edge(a,b);Add_Edge(b,a);
}
for(int i=1;i<=n;i++){
//Add_Equ
for(int j=1;j<=n;j++){
p[i][j]=Cal(j,i);
}
p[i][n+1]=1;
}
//Gauss
for(int i=1;i<=n;i++){
int pos=-1;
for(int j=i;j<=n;j++){
if(p[j][i]){
pos=j;break;
}
}
if(pos==-1){
continue;
}
if(pos!=i){
swap(p[pos],p[i]);
}
for(int j=1;j<=n;j++){
if(j!=i&&p[j][i]){
p[j]^=p[i];
}
}
}
Ans=0x2fffffff;
dfs(n,0);
printf("%d",Ans);
return 0;
}