cogs 539. 牛棚的灯
★★☆?? 輸入文件:lights.in?? 輸出文件:lights.out???簡(jiǎn)單對(duì)比
時(shí)間限制:1 s?? 內(nèi)存限制:128 MB
【問(wèn)題描述】
貝希和她的閨密們?cè)谒齻兊呐E镏型嬗螒颉5翘觳粡娜嗽?#xff0c;突然,牛棚的電源跳閘了,所有的燈都被關(guān)閉了。貝希是一個(gè)很膽小的女生,在伸手不見(jiàn)拇指的無(wú)盡的黑暗中,她感到驚恐,痛苦與絕望。她希望您能夠幫幫她,把所有的燈都給重新開(kāi)起來(lái)!她才能繼續(xù)快樂(lè)地跟她的閨密們繼續(xù)玩游戲!
牛棚中一共有N(1 <= N <= 35)盞燈,編號(hào)為1到N。這些燈被置于一個(gè)非常復(fù)雜的網(wǎng)絡(luò)之中。有M(1 <= M <= 595)條很神奇的無(wú)向邊,每條邊連接兩盞燈。
每盞燈上面都帶有一個(gè)開(kāi)關(guān)。當(dāng)按下某一盞燈的開(kāi)關(guān)的時(shí)候,這盞燈本身,還有所有有邊連向這盞燈的燈的狀態(tài)都會(huì)被改變。狀態(tài)改變指的是:當(dāng)一盞燈是開(kāi)著的時(shí)候,這盞燈被關(guān)掉;當(dāng)一盞燈是關(guān)著的時(shí)候,這盞燈被打開(kāi)。
問(wèn)最少要按下多少個(gè)開(kāi)關(guān),才能把所有的燈都給重新打開(kāi)。
數(shù)據(jù)保證至少有一種按開(kāi)關(guān)的方案,使得所有的燈都被重新打開(kāi)。
題目名稱:lights
輸入格式:
*第一行:兩個(gè)空格隔開(kāi)的整數(shù):N和M。
*第二到第M+1行:每一行有兩個(gè)由空格隔開(kāi)的整數(shù),表示兩盞燈被一條無(wú)向邊連接在一起。
沒(méi)有一條邊會(huì)出現(xiàn)兩次。
樣例輸入(文件 lights.in):
5 6
1 2
1 3
4 2
3 4
2 5
5 3
輸入細(xì)節(jié):
一共有五盞燈。燈1、燈4和燈5都連接著燈2和燈3。
輸出格式:
第一行:一個(gè)單獨(dú)的整數(shù),表示要把所有的燈都打開(kāi)時(shí),最少需要按下的開(kāi)關(guān)的數(shù)目。
樣例輸出(文件 lights.out):
3
輸出細(xì)節(jié):
按下在燈1、燈4和燈5上面的開(kāi)關(guān)。
?
題解:
和poj 1681幾乎一樣,dfs的不懂的看這。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue> 8 #include<vector> 9 using namespace std; 10 int N,M,ANS; 11 int a[50][50]; 12 void gauss(){ 13 for(int i=1;i<=N;i++){ 14 int tmp=i; 15 while(tmp<=N&&a[tmp][i]==0) tmp++; 16 if(tmp>N) continue; 17 if(tmp!=i){ 18 for(int j=1;j<=N+1;j++) swap(a[i][j],a[tmp][j]); 19 } 20 for(int j=1;j<=N;j++){ 21 if(j!=i&&a[j][i]==1){ 22 for(int k=1;k<=N+1;k++) a[j][k]^=a[i][k]; 23 } 24 } 25 } 26 } 27 int s[50],cnt; 28 void dfs(int x){ 29 if(cnt>=ANS) return; 30 if(x==0){ 31 ANS=min(ANS,cnt); 32 return; 33 } 34 if(a[x][x]){ 35 int num=a[x][N+1]; 36 for(int i=x+1;i<=N;i++) 37 if(a[x][i]) 38 num=num^s[i]; 39 s[x]=num; 40 if(num==1) cnt++; 41 dfs(x-1); 42 if(num==1) cnt--; 43 } 44 if(!a[x][x]){ 45 s[x]=0; 46 dfs(x-1); s[x]=1; cnt++; 47 dfs(x-1); cnt--; 48 } 49 } 50 int main(){ 51 //freopen("lights.in","r",stdin); 52 //freopen("lights.out","w",stdout); 53 scanf("%d%d",&N,&M); 54 for(int i=1;i<=N;i++) a[i][i]=1; 55 for(int i=1,u,v;i<=M;i++){ 56 scanf("%d%d",&u,&v); 57 a[u][v]=a[v][u]=1; 58 } 59 for(int i=1;i<=N;i++) a[i][N+1]=1; 60 gauss(); 61 ANS=1<<28; 62 dfs(N); 63 printf("%d",ANS); 64 return 0; 65 }?
轉(zhuǎn)載于:https://www.cnblogs.com/CXCXCXC/p/5226392.html
總結(jié)
以上是生活随笔為你收集整理的cogs 539. 牛棚的灯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一分钟了解阿里云产品:容器服务概述
- 下一篇: 4G模块ME3760_V2的拨号过程