JZOJ 1321. 灯
Description
牛棚中一共有N(1 <= N <= 35)盏灯,编号为1到N。这些灯被置于一个非常复杂的网络之中。有M(1 <= M <= 595)条很神奇的无向边,每条边连接两盏灯。
每盏灯上面都带有一个开关。当按下某一盏灯的开关的时候,这盏灯本身,还有所有有边连向这盏灯的灯的状态都会被改变。状态改变指的是:当一盏灯是开着的时候,这盏灯被关掉;当一盏灯是关着的时候,这盏灯被打开。
问最少要按下多少个开关,才能把所有的灯都给重新打开。
数据保证至少有一种按开关的方案,使得所有的灯都被重新打开。
Input
第二到第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. 灯的更多相关文章
- jzoj P1163 生日派对灯
在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码.这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是 ...
- [jzoj]1115.【HNOI2008】GT考试
Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...
- 微信硬件H5面板开发(二) ---- 实现一个灯的控制
在第一节中讲解了openApi的调用,这一篇讲一下如何实现一个灯的控制.就用微信提供的lamp例子来做,将代码扒下来(实在是没办法,没有示例),整合到自己的项目中.lamp源码:http://file ...
- S5PV210_流水灯
1.整体思路:把相应的配置数据写入相应的寄存器,控制GPIO电平(Led.s)——运用工程管理Makefile编译.链接文件(由Led.s编译得到led.bin,该文件用于USB启动方式点亮LED,若 ...
- 嵌入式Linux学习入门:控制LED灯
记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...
- c语言实现开灯问题
开灯问题: 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依 ...
- 【DFS】POJ 1321
POJ 1321 棋盘问题 题意:中文题不解释. 思路:经典DP,比较取巧的想法是一行行(按照题目意思一行最多只能放一个)来看,标记一列列.注意考虑到有些行可能不放的情况. /** Sample In ...
- <<你的灯亮着吗?>>读书笔记
本书是美国计算机传奇人物杰拉尔德.温伯格和唐纳德.高斯所著,我在网上买到的2003年版的本书,发现本书用20则幽默的现代寓言故事,60幅精美插图,以及一系列的适当提问和建议,让我们的思考方式慢慢得以扩 ...
- Windows on Device 项目实践 5 - 姿态控制灯制作
在前面几篇文章中,我们学习了如何利用Intel Galileo开发板和Windows on Device来设计并完成PWM调光灯.感光灯.火焰报警器和智能风扇的制作,涉及到了火焰传感器.DC直流电机. ...
随机推荐
- 多重背包(dp专题)
题目大意:输入n,代表有n种数,接下来n个数代表n种数,再接下来n个数代表每种数有多少个,在输入K,代表用这些数要加成的和 问你是否能加为K,能输出yes,不能输出no 这是一个典型的多重背包问题,可 ...
- HDU 5908 Abelian Period 可以直接用multiset
http://acm.hdu.edu.cn/showproblem.php?pid=5908 要求把数组分成k组使得每组中的元素出现次数相同 就是分成k个集合,那么直接用multiset判定就可以 有 ...
- 【密码学】MD5算法原理
MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能: 输 ...
- strstr strcpy 函数的实现
一. strcpy 代码实现 #include <iostream> #include <assert.h> #include <iostream> //#incl ...
- setInterval 函数
间隔指定的毫秒数不停地执行指定的代码 setInterval函数参数 codes -- 代码段的字符串表示(与eval函数的参数相同),或者是匿名函数.函数名 interval -- 间隔的毫秒数 s ...
- oop典型应用:实体类
1. 要知道这个图三者的关系 2.实体类属性类型与数据库类型 3.readonly与const的对比 两者的区别如下: ①const能修饰类中的字段(field)或者局部变量(local variab ...
- C#---vs2010发布、打包安装程序程序(转载)
转载地址:点击打开 1. 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三 ...
- centos7 初体验
centos7 https://linux.cn/tag-RHCSA%7CRHCSA.html #/etc/sysconfig/network NETWORKING=yes GATEWAY=192.1 ...
- (转) HTTP Request header
HTTP Request header 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基 ...
- mybatis-mybatis-config.xml详细介绍
1.mybatis-config.xml 1.1:配置,配置可以是引入外部文件,也可以是在本文件内写配置 <!-- <properties resource="jdbc.prop ...