貝希和她的閨密們在她們的牛棚中玩遊戲。但是天不從人願,突然,牛棚的電源跳閘了,所有的燈都被關閉了。貝希是一個很膽小的女生,在伸手不見拇指的無盡的黑暗中,她感到驚恐,痛苦與絕望。她希望您能夠幫幫她,把所有的燈都給重新開起來!她才能繼續快樂地跟她的閨密們繼續玩遊戲! 牛棚中一共有N(1 <= N <= 35)盞燈,編號為1到N。這些燈被置於一個非常複雜的網絡之中。有M(1 <= M <= 595)條很神奇的無向邊,每條邊連接兩盞燈。 每盞燈上面都帶有一個開關。當按下某一盞燈的開關的時候,這盞燈本身,還有所有有邊連向這盞燈的燈的狀態都會被改變。狀態改變指的是:當一盞燈是開著的時候,這盞燈被關掉;當一盞燈是關著的時候,這盞燈被打開。 問最少要按下多少個開關,才能把所有的燈都給重新打開。 數據保證至少有一種按開關的方案,使得所有的燈都被重新打開。
*第一行:兩個空格隔開的整數:N和M。
*第二到第M+1行:每一行有兩個由空格隔開的整數,表示兩盞燈被一條無向邊連接在一起。 沒有一條邊會出現兩次。
第一行:一個單獨的整數,表示要把所有的燈都打開時,最少需要按下的開關的數目。
Gold
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define N 100using namespace std;int n,m,point[N],a[N][N],nxt[N],v[N],b[N],ans[N];int cnt,q[N],mn,bt[N],size,now;void dfs(int i){ if (!i) { mn=min(mn,now); return; } if (now>=mn) return; if (a[i][i]) { for (int j=i+1;j<=n;j++) if (a[i][j]) b[i]^=ans[j]; ans[i]=b[i]; if (b[i]) now++; dfs(i-1); if (b[i]) now--; for (int j=i+1;j<=n;j++) if (a[i][j]) b[i]^=ans[j]; } else { ans[i]=1; now++; dfs(i-1); ans[i]=0; now--; dfs(i-1); }}void guass(){ for (int i=1;i<=n;i++) { int j=i; for (int t=i+1;t<=n;t++) if (a[t][i]) { j=t; break; } if (a[j][i]==0) continue; if (j!=i) { swap(b[j],b[i]); for (int t=1;t<=n;t++) swap(a[i][t],a[j][t]); } for (int t=1;t<=n;t++) if (a[t][i]&&t!=i) { b[t]^=b[i]; for (int j=1;j<=n;j++) a[t][j]^=a[i][j]; } } //for (int i=1;i<=n;i++,cout<<endl) // for (int j=1;j<=n;j++) cout<<a[i][j]<<" "; //for (int i=1;i<=n;i++) cout<<b[i]<<" "; //cout<<endl; dfs(n); //for (int i=1;i<=n;i++) cout<<ans[i]<<" "; //cout<<endl;}int main(){ freopen("a.in","r",stdin); freopen("my.out","w",stdout); scanf("%d%d",&n,&m); mn=n; for (int i=1;i<=n;i++) b[i]=1,a[i][i]=1; for (int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); a[x][y]=a[y][x]=1; } //for (int i=1;i<=n;i++,cout<<endl) // for (int j=1;j<=n;j++) cout<<a[i][j]<<" "; guass(); PRintf("%d/n",mn);}
新闻热点
疑难解答