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. Storm概念学习系列之storm的功能和三大应用

    不多说,直接上干货! storm的功能 Storm 有许多应用领域:实时分析.在线机器学习.持续计算.分布式 RPC(远过程调用协议,一种通过网络从远程计算机程序上请求服务). ETL(Extract ...

  2. 手机uc浏览器,获取到图片,但左上有小图标的问题

    手机uc浏览器有个坑 获取不到图片,左上是这样的

  3. cmd对其他盘符进行操作

    一般我们打开cmd命令时,会出现如下界面: 现在,我想要对g盘进行操作,则输入 --> g:,然后回车,如图: 可以查看一下g盘下的所有子目录,输入 --> dir,回车,结果如下: 我想 ...

  4. vscode jsx语法自动补全html代码

    1.点击文件——>首选项——>设置 注意:只有在js文件里的jsx才可以自动补全,html文件里的jsx不能.

  5. 树莓派-(一)开箱到点亮一些坑(无屏、无wlan、无直连键鼠)

    0x00.前期准备: 材料: 树莓派3b+ 板子 * 1,适配电源 * 1,网线 * 2,sd卡16G * 1,读卡器 * 1 安装时注意,3b+三个散热片贴好.小风扇接线要接对 工具: 0x01. ...

  6. 私有npm下载资源

    私有npm库下载资源需要用户名和密码,这个需要创建npm库的人提供. 使用方法: npm login --registry=仓库地址 Username: 用户名 Password: 密码 Email: ...

  7. visual studio2010中C#生成的,ArcGIS二次开发的basetool的dll,注册为COM组件tlb文件,并在arcmap中加载使用

    写了个标题好长啊~~~~ 这两天又认识了一个新玩意,记录一下下,啦啦啦~~~~~ 话说,认识arcgis快十年了,从桌面版到engine的二次开发,其实不过才认识到它的冰山一角, 它总是能带来很多还未 ...

  8. eclipse, idea安装lombok插件

    参考博客: https://www.cnblogs.com/quan-coder/p/8387040.html 一:在开发工具中安装插件: Eclipse: 下载地址:https://projectl ...

  9. SpringBoot的核心功能

    1.独立运行的Spring项目 SpringBoot可以以jar包的形式独立运行,运行一个SpringBoot项目只需要通过java -jar xx.jar来启动. 2.内嵌Servlet容器 Spr ...

  10. JIRA Plugin Development——Configurable Custom Field Plugin

    关于JIRA Plugin开发的中文资料相当少,这可能还是由于JIRA Plugin开发在国内比较小众的原因吧,下面介绍下自己的一个JIRA Plugin开发的详细过程. 业务需求 创建JIRA IS ...