比赛 20120417 评测结果 AAAAAAAAAAAAAAAAA
题目名称 牛棚的灯 最终得分 100
用户昵称 王者自由 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-17 08:58:03
显示代码纯文本
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 40, INF = ~0u>>2;
int n, m, x, y, a = INF, G[N][N];
bool b[N], s[N];
void Swap(int i, int j) {
    for(int l=1; l<=n; l++)
        swap(G[i][l], G[j][l]);
    swap(b[i], b[j]);
}
void Xor(int i, int j) {
    for(int l=1; l<=n; l++)
        G[i][l] ^= G[j][l];
    b[i] ^= b[j];
}
void DFS(int k, int c) {
    if(c >= a) return;
    if(k == 0) {
        if(c < a) a = c;
        return;
    }
    if(G[k][k]) {
        bool t = b[k];
        for(int i=k+1; i<=n; i++) if(G[k][i])
            t ^= s[i];
        (s[k] = t) ? DFS(k-1, c+1) : DFS(k-1, c);
    } else {
        s[k] = false; DFS(k-1, c);
        s[k] = true; DFS(k-1, c+1);
        s[k] = false;
    }
}
int main() {
    freopen("lights.in", "r", stdin);
    freopen("lights.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(int i=1; i<=n; i++) G[i][i] = b[i] = 1;
    for(int i=1; i<=m; i++) {
        scanf("%d %d", &x, &y);
        G[x][y] = G[y][x] = 1;
    }
    for(int k=1; k<=n; k++) {
        bool f = false;
        for(int i=k; i<=n; i++) if(G[i][k]) {
            f = true;
            Swap(i, k);
            break;
        }
        if(!f) continue;
        for(int i=k+1; i<=n; i++) if(G[i][k])
            Xor(i, k);
    }
    DFS(n, 0);
    printf("%d\n", a);
    return 0;
}