http://172.20.6.3/Problem_Show.asp?id=1530

元宵节快要到了,某城市人民公园将举办一次灯展。Dr.Kong准备设计出一个奇妙的展品,他计划将编号为1到N的N(1 <= N <= 35)盏灯放置在一个有M条(1 <= M <= 595)边连接的网络节点上。
每盏灯上面都带有一個开关。当按下某一盏灯的开关時,这盏灯本身以及与之有边相连的灯的状态就会改变。状态改变指的是:当一盏灯是亮时,就会被关闭;当一盏灯是关闭时,就会被打开亮着。
现在的问题是,你能帮助Dr.Kong计算一下最少要按下多少个开关,才能把所有的灯都打开亮着(初始状态:所有的灯都是关闭的)。
数据保证至少有一种按开关的方案,使得所有的灯都能被重新打开。

题目和数据范围说明这道题可以dfs,但是直接dfs会超时。

这里要用一个在很多可以状压的dfs里都很有用的优化技巧(可以把普通dfs的时间复杂度优化到开根号):折半搜索

在这道题中,因为每个灯只有按或者不按两种选项,可以对前n/2个点进行搜索,再对剩余的点进行一次搜索并hash查找对应状态。

代码

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<map>
using namespace std;
map<long long,long long>q;
long long n,m,mid;
bool e[][]={};
long long v[]={};
long long ans=;
long long cnt=;
void dfs(long long x,long long k,long long num){
if(num){
if(k<q[num]||q[num]==)q[num]=k;
}
if(k>ans)return;
if(num==cnt)
if(k<ans)ans=k;
for(int i=x+;i<=mid;i++){
dfs(i,k+,num^v[i]);
}
}
void dfs1(long long x,long long k,long long num){
if(k>ans)return;
if(num==cnt){
if(k<ans)ans=k;
return;
}
long long xx=cnt-num;
long long w=q[xx];
if(w!=){
if(w+k<ans){
ans=w+k;
return;
}
}
for(int i=x+;i<=n;i++){
dfs1(i,k+,num^v[i]);
}
}
int main(){
scanf("%lld%lld",&n,&m);
mid=n/;
long long x,y;
for(int i=;i<=m;i++){
scanf("%lld%lld",&x,&y);
e[x][y]=;e[y][x]=;
}
for(int i=;i<=n;i++){
e[i][i]=;
long long num=;
for(int j=;j<=n;j++){
if(e[i][j])num+=(long long)<<(j-);
}v[i]=num;
}cnt=((long long)<<n)-;ans=n;
dfs(,,);
dfs1(mid,,);
cout<<ans<<endl;
return ;
}

JZYZOJ1530 [haoi2013]开关控制 状压 dfs 折半搜索的更多相关文章

  1. ZOJ 1609 Equivalence(状压+dfs减枝)

    ZOJ Problem Set - 1609 Equivalence Time Limit: 5 Seconds      Memory Limit: 32768 KB When learning m ...

  2. bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1122  Solved: 80 ...

  3. 状压dfs小记

    一点前(tu)言(cao) 真的考起dfs来可谓是什么都能往dfs上套 状压不止能dp,还能与dfs结合成为搜索好(duliu)题 剪枝卡常司空见惯(打开题解一看并不是纯dfs,emmmm) 开始正文 ...

  4. codeforces 285 D. Permutation Sum 状压 dfs打表

    题意: 如果有2个排列a,b,定义序列c为: c[i] = (a[i] + b[i] - 2) % n + 1 但是,明显c不一定是一个排列 现在,给出排列的长度n (1 <= n <= ...

  5. UVALive 6255:Kingdoms(状压DFS)

    题目链接 题意 给出n个王国和n*n的矩阵,mp[i][j] 代表第 i 个王国欠第 j 个王国 mp[i][j] 块钱.如果当前的王国处于负债状态,那么这个王国就会被消除,和它相连的王国的债务都会被 ...

  6. 2018icpc南京网络赛-E AC Challenge(状压+dfs)

    题意: n道题,每道题有ai和bi,完成这道题需要先完成若干道题,完成这道题可以得到分数t*ai+bi,其中t是时间 1s, n<=20 思路: 由n的范围状压,状态最多1e6 然后dfs,注意 ...

  7. 相邻行列相互影响的状态类问题(类似状压dp的搜索)(POJ3279)

    POJ3279http://poj.org/problem?id=3279 题意:黑白的板,每次选择一个十字形翻转(十字板内黑白互换,若是边界则不管),求最小将原图变为全白的策略. 这是一道对于每个格 ...

  8. hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)

    对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...

  9. HDU - 6341 多校4 Let Sudoku Rotate(状压dfs)

    Problem J. Let Sudoku Rotate Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K ...

随机推荐

  1. 【转载】VS2013安装需要IE10

    因为需要移动办公,需要给笔记本搭建编程环境.安装VS2013时遇到了小麻烦,提示我,需要安装IE10. 然后我很听话的按照提供的超链接,到了官网,下载了最新的IE11,然后安装,结果告诉我下载的IE版 ...

  2. 【洛谷 P4568】 [JLOI2011]飞行路线 (分层最短路)

    题目链接 分层图最短路. 把每个点拆成\(k+1\)个点,表示总共有\(k+1\)层. 然后每层正常连边, 若\((u,v)\)有边,则把每一层的\(u\)和下一层的\(v\).每一层的\(v\)和下 ...

  3. TensorFlow非线性拟合

    1.心得: 在使用TensorFlow做非线性拟合的时候注意的一点就是输出层不能使用激活函数,这样就会把整个区间映射到激活函数的值域范围内无法收敛. # coding:utf-8 import ten ...

  4. bzoj 2440 dfs序

    首先我们可以做一遍dfs,用一个队列记录每个点进出的顺序,当每个点访问的时候que[tot++]=x,记为in[x],当结束dfs的时候que[tot++]=x,记为out[x],这样处理出来的队列, ...

  5. 探索ReactNative应用

    本篇文章是我看AC2016腾讯前端技术交流大会后写的.写的不好,大家见谅啊. 一,什么是ReactNative? 简单来说就是可以用javascript来写APP了,而且性能还不错. 用JS写的话已经 ...

  6. CSS浮动和清除

    float:让元素浮动,取值:left(左浮动).right(右浮动) clear:清除浮动,取值:left(清除左浮动).right(清除右浮动).both(同时清除上面的左浮动和右浮动) 1.CS ...

  7. 大原則 研讀 spec 與 code 的 心得

    最近在研究 stm32f429i-disc0 的 device tree source code, 並且 參造 Devicetree Specification Release 0.1, 在 dts ...

  8. 【bzoj1923】外星千足虫

    这个gauss消元有点naive啊. 由于只有01,位操作显然是方便的多. 那么用bitset代替之前的增广矩阵就行了. #include<bits/stdc++.h> #define N ...

  9. [ Linux ] 服务器更换硬盘

    服务器型号:ThinkServer RD650操作系统:Red Hat 6.7业务用途:生产环境监控机 接到机房邮件通知,告知某台服务器硬盘告警,并提供了设备SN号和机柜位置.根据提供想相关信息找到对 ...

  10. [PAT] 1140 Look-and-say Sequence(20 分)

    1140 Look-and-say Sequence(20 分)Look-and-say sequence is a sequence of integers as the following: D, ...