zoukankan      html  css  js  c++  java
  • bzoj1770: [Usaco2009 Nov]lights 燈

    高斯消元解异或方程组,然后爆搜。。。%%%zyf http://www.cnblogs.com/zyfzyf/p/4059245.html 看了注释才懂了%%%

    #include<cstdio>
    #include<cstring>
    #include<bitset>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define REP(i,s,t) for(int i=s;i<=t;i++)
    #define dwn(i,s,t) for(int i=s;i>=t;i--)
    #define clr(x,c) memset(x,c,sizeof(x))
    int read(){
    	int x=0;char c=getchar();
    	while(!isdigit(c)) c=getchar();
    	while(isdigit(c)) x=x*10+c-'0',c=getchar();
    	return x;
    }
    const int nmax=37;
    const int inf=0x7f7f7f7f;
    bitset<nmax>a[nmax];
    int ans[nmax],res=inf,tot=0,N,M;
    void Gauss(int n,int m){
    	REP(i,1,n){
    		int j;
    		for(j=i;j<=n&&!a[j][i];j++);
    		if(j>n) continue;
    		if(j!=i) swap(a[i],a[j]);
    		REP(j,i+1,n) if(a[j][i]) a[j]^=a[i];
    	}
    }
    void dfs(int x){
    	if(tot>=res) return ;
    	if(!x){
    		res=min(res,tot);return ;
    	}
    	if(a[x][x]){
    		int t=a[x][N+1];
    		REP(i,x+1,N) if(a[x][i]) t^=ans[i];
    		ans[x]=t;
    		if(t) tot++;
    		dfs(x-1);
    		if(t) tot--;
    	}else{
    		ans[x]=0;dfs(x-1);
    		ans[x]=1;tot++;dfs(x-1);tot--;
    	}
    }
    int main(){
    	N=read(),M=read();int u,v;
    	REP(i,1,N) a[i].reset(),a[i][i]=a[i][N+1]=1;
    	REP(i,1,M) u=read(),v=read(),a[u][v]=a[v][u]=1;
    	Gauss(N,N+1);
    	dfs(N);
    	printf("%d
    ",res);
    	return 0;
    }
    

      

    1770: [Usaco2009 Nov]lights 燈

    Time Limit: 10 Sec  Memory Limit: 64 MB
    Submit: 712  Solved: 347
    [Submit][Status][Discuss]

    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

    [Submit][Status][Discuss]
  • 相关阅读:
    el-input 标签中密码的显示和隐藏
    java 使用RedisTemplate实现Redis事务
    mac 安装 Java 环境
    Snowflake 分布式UUID
    lsof 查看端口使用时刻
    nginx.pid" failed (2: No such file or directory)
    解决Redis之MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist
    Linux环境下 Jna 解决so依赖文件not found
    Ubuntu mysql 在线安装
    Linux中为什么执行自己的程序要在前面加./
  • 原文地址:https://www.cnblogs.com/fighting-to-the-end/p/5698003.html
Copyright © 2011-2022 走看看