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. Matrix Power Series POJ - 3233 矩阵幂次之和。

    矩阵幂次之和. 自己想着想着就想到了一个解法,但是还没提交,因为POJ崩了,做了一个FIB的前n项和,也是用了这个方法,AC了,相信是可以得. 提交了,是AC的 http://poj.org/prob ...

  2. Gym 101047M Removing coins in Kem Kadrãn

    给定一个序列,只能拿走D,隔壁的会翻转,问能否全部拿走. 注意到如果能拿走的话,拿D的顺序是没关系的.模拟即可 #include <cstdio> #include <cstdlib ...

  3. Storm概念学习系列之Task任务

    不多说,直接上干货! 每一个Spout/Bolt的线程称为一个Task. Task任务 Task是运行Spout或Bolt的单元,每一个Spout/Bolt的线程称为一个Task. 在Storm 0. ...

  4. IoC和AOP使用扩展。。。

    实现依赖的多种方式. 1.理解构造注入. 2.掌握使用p命名空间实现属性注入. 3.理解不同的数据类型的注入方式. 4.如何通过构造注入为业务类注入所依赖的数据访问层对象,实现保存用户数据功能. 5. ...

  5. mysql 批量修改 表字段/表/数据库 字符集和排序规则

    今天接到一个任务是需要把数据库的字符编码全部修改一下,写了以下修正用的SQL,修正顺序是   表字段 > 表 > 数据库. 表字段修复: #改变字段数据 SELECT TABLE_SCHE ...

  6. 一个关于document.write()的问题

    Index.html中: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...

  7. sublime 常用快捷键(转)

    Sublime text 3是码农最喜欢的代码编辑器,每天和代码打交道,必先利其器,掌握基本的代码编辑器的快捷键,能让你打码更有效率.刚开始可能有些生疏,只要花一两个星期坚持使用并熟悉这些常用的快捷键 ...

  8. Lua学习---函数定义

    1.函数定义的格式: Lua使用function定义函数,语法如下: function function_name (arc) --arc表示参数列表,函数的参数列表可以为空 --body end 上 ...

  9. 父类和子类以及super关键字

    super和this关键字的特点类似:super代表的是父类对象的引用. 当子父类的成员出现同名时,可以通过super来进行区分. 子类的构造方法中,通过super关键字调用父类的构造方法. publ ...

  10. JSON.parse() 和 JSON.stringify()的简单介绍

    参考地址: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse ht ...