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上面的開關。

Solution

不能再这么颓了不然真的就要凉透了
还有这题目为什么是繁体的

搞死小圆高斯消元好强啊QAQ这个题的做法也好神奇啊
很容易可以发现,开关的顺序不会影响最终结果

那么到底应该怎么搞呢?举个栗子
有3盏灯,其中1和2连接,1和3不连接,那么我们可以列出一个方程
(1*ans[1])^(1*ans[2])^(0*ans[3])=1
ans[]表示这个灯有没有按。灯1本身或者和灯1相连的灯系数为1,否则为0
为什么这么列呢?很容易发现,如果为1的项的异或和为1,那么最后结果肯定是1
感性理解一下,应该挺好懂的
以此类推我们可以列出n个这样的方程,然后我们就可以用高斯消元来把这个矩阵消了
消异或矩阵和消普通矩阵是一样的,只不过是把加减的操作换成异或
 
消了之后不要记着求答案,因为答案里面可能有自由变元。
怎么办呢?可以用爆搜替代普通高斯消元的答案回带,
若当前行的答案固定就算出来,否则的话就枚举0/1记入答案。继续搜下一层。

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#define N (50)
using namespace std; int n,m,minn=0x7fffffff,u,v;
int f[N][N],ans[N],head[N],num_edge; void Gauss()
{
for (int i=; i<=n; ++i)
{
int num=i;
for (int j=i+; j<=n; ++j)
if (f[j][i]>f[i][i])
num=j;
if (num!=i)
for (int j=; j<=n+; ++j)
swap(f[i][j],f[num][j]);
for (int j=i+; j<=n; ++j)
if (f[j][i])
for (int k=i; k<=n+; ++k)
f[j][k]^=f[i][k];
}
} void Dfs(int x,int now)
{
if (now>=minn) return;
if (x==) {minn=now; return;} if (f[x][x])
{
int t=f[x][n+];
for (int i=x+; i<=n; ++i) t^=f[x][i]*ans[i];
ans[x]=t;
Dfs(x-,now+(t==));
}
else
{
ans[x]=; Dfs(x-,now);
ans[x]=; Dfs(x-,now+);
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=m; ++i)
{
scanf("%d%d",&u,&v);
f[u][v]=f[v][u]=;
}
for (int i=; i<=n; ++i) f[i][n+]=f[i][i]=;
Gauss();
Dfs(n,);
printf("%d",minn);
}

BZOJ1770:[USACO]lights 燈(高斯消元,DFS)的更多相关文章

  1. BZOJ 1770: [Usaco2009 Nov]lights 燈( 高斯消元 )

    高斯消元解xor方程组...暴搜自由元+最优性剪枝 -------------------------------------------------------------------------- ...

  2. [luoguP2962] [USACO09NOV]灯Lights(高斯消元 + dfs)

    传送门 先进行高斯消元 因为要求最少的开关次数,那么: 对于关键元,我们可以通过带入消元求出, 对于自由元,我们暴力枚举,进行dfs,因为只有开关两种状态,0或1 #include <cmath ...

  3. BZOJ 1770: [Usaco2009 Nov]lights 燈 [高斯消元XOR 搜索]

    题意: 经典灯问题,求最少次数 本题数据不水,必须要暴搜自由元的取值啦 想了好久 然而我看到网上的程序都没有用记录now的做法,那样做遇到自由元应该可能会丢解吧...? 我的做法是把自由元保存下来,枚 ...

  4. bzoj 1770: [Usaco2009 Nov]lights 燈【高斯消元+dfs】

    参考:https://blog.csdn.net/qq_34564984/article/details/53843777 可能背了假的板子-- 对于每个灯建立方程:与它相邻的灯的开关次数的异或和为1 ...

  5. poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8481   Accepted: 5479 Description In an ...

  6. Flip Game (高斯消元 || dfs)

    Flip game is played on a rectangular 4x4 field with two-sided pieces placed on each of its 16 square ...

  7. Codeforces 1163E 高斯消元 + dfs

    题意:给你一个集合,让你构造一个长度尽量长的排列,使得排列中任意相邻两个位置的数XOR后是集合中的数. 思路:我们考虑枚举i, 然后判断集合中所有小于1 << i的数是否可以构成一组异或空 ...

  8. POJ 1222 EXTENDED LIGHTS OUT (高斯消元)

    题目链接 题意:5*6矩阵中有30个灯,操作一个灯,周围的上下左右四个灯会发生相应变化 即由灭变亮,由亮变灭,如何操作使灯全灭? 题解:这个问题是很经典的高斯消元问题.同一个按钮最多只能被按一次,因为 ...

  9. POJ1222 EXTENDED LIGHTS OUT 高斯消元 XOR方程组

    http://poj.org/problem?id=1222 在学校oj用搜索写了一次,这次写高斯消元,haoi现场裸xor方程消元没写出来,真实zz. #include<iostream> ...

随机推荐

  1. Golang教程:函数、变参函数

    函数是完成一个特定任务的代码块.一个函数接受输入,对输入进行一些运算并产生输出. 函数声明 在 Go 中声明一个函数的语法为: func functionname(parametername type ...

  2. python-爬虫之re模块

    re模块中常用功能函数 1.compile() 编译正则表达式模式,返回一个对象的模式.(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率.) 格式: re.compile(pat ...

  3. [Hadoop大数据]--kafka入门

    问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行“随机读写”的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? ...

  4. js验证身份证号码是否合规

    需求:最近要做实名验证的功能,但是验证身份证号码和身份证图片的接口不想短信,比较贵,所以之前我们要验证严谨一点,参考了网上关于验证身份证号码的代码,总结一下 代码: //验证身份证号码 functio ...

  5. Ajax发送GET、POST请求和响应XML数据案例

    1.新建工程 新建一个java web工程,新建一个Servlet文件 AServlet.java,用于返回get和post请求. public class AServlet extends Http ...

  6. ASP.NET MVC4 新手入门教程之三 ---3.添加视图

    在这一节你要修改HelloWorldController类要使用的视图模板文件来干净封装生成 HTML 响应到客户端的过程. 您将创建一个使用Razor 视图引擎介绍 ASP.NET MVC 3 的视 ...

  7. isPrototypeOf、instanceof、hasOwnProperty函数整理

    isPrototypeOf 作用:检测一个对象是否是另一个对象的原型.或者说一个对象是否被包含在另一个对象的原型链中 var p = {x:1};//定义一个原型对象 var o = Object.c ...

  8. Python基础学习总结(九)

    11测试代码 1.编写函数和类时,还可以编写测试函数,通过测试可以确定代码面对各种输入都能正常工作.在程序中添加新代码时,也可以对其进行测试,确定他们不会破坏程序的既有程序.要经常测试模块. 2.通过 ...

  9. js 去除空格回车换行

    开发中遇到特殊需求,需要将空格回车换行替换成逗号 直接使用正则表达式解决: 变量.replace(/\s+/g,","); 如果想要去除则将后面逗号变成空就OK了.

  10. Java--详解WebService技术

    Java--详解WebService技术 一.什么是 webservice WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓跨编程语言和跨操作平台,就是说服务端程序采用jav ...