1321. 灯

Time Limits: 1000 ms  Memory Limits: 65536 KB  Detailed Limits

Goto ProblemSet

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

Sample Output

3
 
做法:高斯消元解异或方程组,或折半搜索都可以过啦。
 #include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#define LL long long
using namespace std;
LL m[][];
int n, M, b[], ans, Ans[]; void Init()
{
scanf("%d%d", &n, &M);
for (int i = ; i <= n; i++)
m[i][i] = , b[i] = ;
for (int i = ; i <= M; i++)
{
int u, v;
scanf("%d%d", &u, &v);
m[u][v] = ;
m[v][u] = ;
}
} void Dfs(int dep, int count)
{
if (count >= ans) return;
if (dep == )
{
if (count < ans) ans = count;
return;
}
if (m[dep][dep])
{
bool now = b[dep];
for (int i = dep + ; i <= n; i++)
if (m[dep][i]) now ^= Ans[i];
Ans[dep] = now;
if (Ans[dep]) Dfs(dep - , count + );
else Dfs(dep - , count);
}
else
{
Ans[dep] = ; Dfs(dep - , count);
Ans[dep] = ; Dfs(dep - , count + );
Ans[dep] = ;
}
} void Swap(int l, int r)
{
for (int i = ; i <= n; i++)
swap(m[l][i], m[r][i]);
swap(b[l], b[r]);
} void Xor(int l, int r)
{
for (int i = ; i <= n; i++)
m[l][i] ^= m[r][i];
b[l] ^= b[r];
} void Work()
{
for (int k = ; k <= n; k++)
{
bool flag = ;
for (int i = k; i <= n; i++)
if (m[i][k])
{
flag = ;
Swap(i, k);
break;
}
if (flag == ) continue;
for (int i = k + ; i <= n; i++)
if (m[i][k]) Xor(i, k);
}
} int main()
{
Init();
Work();
ans = ;
Dfs(n, );
printf("%d", ans);
}

高斯消元

 #include <cstdio>
#include <iostream>
#include <cstring>
#define N 40
#define M 100007
#define LL long long
using namespace std;
int n, m, tot, g[M + ], ans = M;
LL h[M + ], Ans, a[N], S[]; void Pre_work()
{
S[] = ;
for (int i = ; i <= ; i++) S[i] = S[i - ] * ;
} void Init()
{
Pre_work();
scanf("%d%d", &n, &m);
int u, v;
for (int i = ; i <= n; i++)
a[i] |= S[i];
for (int i = ; i <= m; i++)
{
scanf("%d%d", &u, &v);
a[u] |= S[v];
a[v] |= S[u];
}
Ans = S[n + ] - ;
} int Hash(LL x)
{
int p = x % M;
for (; h[p] != && h[p] != x; p = (p + ) % M);
return p;
} void Dfs(int dep, LL num, int step)
{
if (dep > tot)
{
if (num == Ans) ans = min(ans, step);
int site = Hash(num);
if (!h[site]) h[site] = num, g[site] = step;
else g[site] = g[site] < step ? g[site] : step;
return;
}
Dfs(dep + , num ^ a[dep], step + );
Dfs(dep + , num, step);
} void dfs(int dep, LL num, int step)
{
if (dep > n)
{
if (num == Ans) ans = min(ans, step);
LL p = Ans ^ num;
int site = Hash(p);
if (h[site]) ans = min(ans, g[site] + step);
return;
}
dfs(dep + , num ^ a[dep], step + );
dfs(dep + , num, step);
} int main()
{
Init();
tot = n / ;
Dfs(, , );
dfs(tot + , , );
printf("%d", ans);
}

折半搜索

JZOJ 1321. 灯的更多相关文章

  1. jzoj P1163 生日派对灯

    在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码.这些灯都连接到四个按钮:  按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是 ...

  2. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  3. 微信硬件H5面板开发(二) ---- 实现一个灯的控制

    在第一节中讲解了openApi的调用,这一篇讲一下如何实现一个灯的控制.就用微信提供的lamp例子来做,将代码扒下来(实在是没办法,没有示例),整合到自己的项目中.lamp源码:http://file ...

  4. S5PV210_流水灯

    1.整体思路:把相应的配置数据写入相应的寄存器,控制GPIO电平(Led.s)——运用工程管理Makefile编译.链接文件(由Led.s编译得到led.bin,该文件用于USB启动方式点亮LED,若 ...

  5. 嵌入式Linux学习入门:控制LED灯

    记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...

  6. c语言实现开灯问题

    开灯问题: 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依 ...

  7. 【DFS】POJ 1321

    POJ 1321 棋盘问题 题意:中文题不解释. 思路:经典DP,比较取巧的想法是一行行(按照题目意思一行最多只能放一个)来看,标记一列列.注意考虑到有些行可能不放的情况. /** Sample In ...

  8. <<你的灯亮着吗?>>读书笔记

    本书是美国计算机传奇人物杰拉尔德.温伯格和唐纳德.高斯所著,我在网上买到的2003年版的本书,发现本书用20则幽默的现代寓言故事,60幅精美插图,以及一系列的适当提问和建议,让我们的思考方式慢慢得以扩 ...

  9. Windows on Device 项目实践 5 - 姿态控制灯制作

    在前面几篇文章中,我们学习了如何利用Intel Galileo开发板和Windows on Device来设计并完成PWM调光灯.感光灯.火焰报警器和智能风扇的制作,涉及到了火焰传感器.DC直流电机. ...

随机推荐

  1. (转)Linux修改eth2到eth0(70-persistent-net.rules)

    之前在公司提供的虚拟机器上面,一直有个问题用着很不舒服,为什么它的IP选择的设备的eth2的,但是我在/etc/sysconfig/network-scrpts/下面也没有找到ifcfg-eth2的配 ...

  2. JAVA多线程面试题目

    1,java中有几种方法可以实现一个线程? 答:在Java中实现一个线程有两种方法,第一是实现Runnable接口实现它的run()方法,第二种是继承Thread类,覆盖它的run()方法.这两种方法 ...

  3. map 常用方法

    map遍历: Map map = new HashMap(); Iterator it = map.entrySet().iterator(); while(it.hasNext()) { Map.E ...

  4. jQuery 方法 属性

    Attribute:$("p").addClass(css中定义的样式类型); 给某个元素添加样式$("img").attr({src:"test.j ...

  5. js统计字符出现次数

    var s = "The rain in Spain falls rain mainly in the rain plain"; var reg = new RegExp(&quo ...

  6. C 碎片八 结构体&枚举&联合

    一.结构体 1, 结构体定义 结构体类型的定义:任意数据类型变量的集合.用于描述一个具体的事物的信息,在C语言中描述一件事物一般都是用结构体 声明结构体类型的格式: struct  结构体名 {成员列 ...

  7. java之struts框架入门教程

    本教程主要讲述struts的简单入门操作 使用的是myeclipse工具 1.创建web项目 2.复制struts必要的jar包到 WebRoot/WEB-INF/lib 下 jar包列表如下: as ...

  8. idea 清屏(控制台)快捷键

    eclipse清屏快捷键为鼠标右键+R 而在idea中默认并没有清屏console的快捷键 所以需要我们自行设置: 1,ctrl+alt+s打开settings 2,找到keymap 3,搜索 cle ...

  9. flask之jinja2模板语言

    一.jinja2简单介绍 Jinja2是Python里一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能.其中最显著的一个是增加了沙箱执行功能和可选的 ...

  10. socket网络套节字---聊天室

    一:服务端: 1.创建客户端: package com.ywh.serversocket; import java.io.InputStream; import java.io.OutputStrea ...