1770: [Usaco2009 Nov]lights 燈

Description

貝希和她的閨密們在她們的牛棚中玩遊戲。但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了。貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望。她希望您能夠幫幫她,把所有的燈都給重新開起來!她才能繼續快樂地跟她的閨密們繼續玩遊戲! 牛棚中一共有N(1 <= N <= 35)盞燈,編號為1到N。這些燈被置於一個非常複雜的網絡之中。有M(1 <= M <= 595)條很神奇的無向邊,每條邊連接兩盞燈。 每盞燈上面都帶有一個開關。當按下某一盞燈的開關的時候,這盞燈本身,還有所有有邊連向這盞燈的燈的狀態都會被改變。狀態改變指的是:當一盞燈是開著的時候,這盞燈被關掉;當一盞燈是關著的時候,這盞燈被打開。 問最少要按下多少個開關,才能把所有的燈都給重新打開。 數據保證至少有一種按開關的方案,使得所有的燈都被重新打開。

Input

*第一行:兩個空格隔開的整數:N和M。

*第二到第M+1行:每一行有兩個由空格隔開的整數,表示兩盞燈被一條無向邊連接在一起。 沒有一條邊會出現兩次。

Output

第一行:一個單獨的整數,表示要把所有的燈都打開時,最少需要按下的開關的數目。

Sample Input

5 6
1 2
1 3
4 2
3 4
2 5
5 3

輸入細節:

一共有五盞燈。燈1、燈4和燈5都連接著燈2和燈3。

Sample Output

3

輸出細節:

按下在燈1、燈4和燈5上面的開關。

HINT

 

Source

 
类似高斯消元的方法解异或方程组。。果断跪了。。
然后还要枚举自由元。。。OTL。。
挖个坑。。。还需要理解。。。毕竟弱。。
 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<algorithm>
 7 #include<string>
 8 #include<map>
 9 #include<queue>
10 #include<vector>
11 #include<set>
12 #define inf 1000000000
13 #define maxn 10000+5
14 #define maxm 10000+5
15 #define eps 1e-10
16 #define ll long long
17 #define for0(i,n) for(int i=0;i<=(n);i++)
18 #define for1(i,n) for(int i=1;i<=(n);i++)
19 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
20 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
22 using namespace std;
23 int read(){
24     int x=0,f=1;char ch=getchar();
25     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
26     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
27     return x*f;
28 }
29 int n,m,tot;
30 int mn=inf;
31 int f[45][45],ans[45];
32 void gauss(){
33     for1(i,n){
34         int j=i;
35         while(j<=n&&!f[j][i])j++;
36         if(j>n)continue;
37         if(j!=i)for1(k,n+1)swap(f[i][k],f[j][k]);
38         for2(j,i+1,n)
39             if(f[j][i])
40                 for2(k,i,n+1)
41                     f[j][k]^=f[i][k];
42     }
43 }
44 void dfs(int x){
45     if(tot>=mn)return;
46     if(!x){mn=min(mn,tot);return;}
47     if(f[x][x]){
48         int t=f[x][n+1];
49         for2(i,x+1,n)if(f[x][i])t^=ans[i];
50         ans[x]=t;
51         if(t)tot++;
52         dfs(x-1);
53         if(t)tot--;
54     }
55     else{
56         ans[x]=0;dfs(x-1);
57         ans[x]=1;tot++;dfs(x-1);tot--;
58     }
59 }
60 int main(){
61     //freopen("input.txt","r",stdin);
62     //freopen("output.txt","w",stdout);
63     n=read();m=read();
64     for1(i,n)f[i][i]=1,f[i][n+1]=1;
65     for1(i,m){
66         int x=read(),y=read();
67         f[x][y]=f[y][x]=1;
68     }    
69     gauss();dfs(n);
70     printf("%d",mn);
71     return 0;
72 }
View Code

 

posted @ 2016-03-19 16:38  HTWX  阅读(100)  评论(0编辑  收藏  举报