JZYZOJ1530 [haoi2013]开关控制 状压 dfs 折半搜索
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 折半搜索的更多相关文章
- ZOJ 1609 Equivalence(状压+dfs减枝)
ZOJ Problem Set - 1609 Equivalence Time Limit: 5 Seconds Memory Limit: 32768 KB When learning m ...
- bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)
1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1122 Solved: 80 ...
- 状压dfs小记
一点前(tu)言(cao) 真的考起dfs来可谓是什么都能往dfs上套 状压不止能dp,还能与dfs结合成为搜索好(duliu)题 剪枝卡常司空见惯(打开题解一看并不是纯dfs,emmmm) 开始正文 ...
- codeforces 285 D. Permutation Sum 状压 dfs打表
题意: 如果有2个排列a,b,定义序列c为: c[i] = (a[i] + b[i] - 2) % n + 1 但是,明显c不一定是一个排列 现在,给出排列的长度n (1 <= n <= ...
- UVALive 6255:Kingdoms(状压DFS)
题目链接 题意 给出n个王国和n*n的矩阵,mp[i][j] 代表第 i 个王国欠第 j 个王国 mp[i][j] 块钱.如果当前的王国处于负债状态,那么这个王国就会被消除,和它相连的王国的债务都会被 ...
- 2018icpc南京网络赛-E AC Challenge(状压+dfs)
题意: n道题,每道题有ai和bi,完成这道题需要先完成若干道题,完成这道题可以得到分数t*ai+bi,其中t是时间 1s, n<=20 思路: 由n的范围状压,状态最多1e6 然后dfs,注意 ...
- 相邻行列相互影响的状态类问题(类似状压dp的搜索)(POJ3279)
POJ3279http://poj.org/problem?id=3279 题意:黑白的板,每次选择一个十字形翻转(十字板内黑白互换,若是边界则不管),求最小将原图变为全白的策略. 这是一道对于每个格 ...
- hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)
对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...
- HDU - 6341 多校4 Let Sudoku Rotate(状压dfs)
Problem J. Let Sudoku Rotate Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K ...
随机推荐
- Html5学习1(Html属性、Html CSS:)
Html属性 1.Html要求使用小写属性. Html标题 1.确保将Html标题标签只用于标题.不要仅仅为了生成粗体或大号的文本而使用标题. 2.<hr>标签在Html页面中创建水平线, ...
- 撩下Cookie和Session
Cookie Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读 ...
- webpack自动生成项目的html
1 自动生成多个html页面 设置webpack.config.js中的plugins属性,多次调用plugin插件(new htmlWebpackPlugin()),同时设置对应数量的.js入口文件 ...
- GitHub创建项目入门学习
第一次创建git项目注意事项还是挺多了,这里就写个操作步骤,方便以后查看. 网页部分 1.打开自己的主页,点击“New repository”创建远程仓库. 2.填写信息 本地部分 前提: 下载git ...
- python3使用web.py遇到的找不属性的错误解决
今天用pyhon安装完web.py的时候,点击运行还是没错的,但是在网页输入链接就会报错.1.安装我是这样的: pip install web.py 2.运行后错误信息是这样: AttributeEr ...
- unbutu下Io language的解释器安装
今晚看Io,然后要安装解释器,然后就记录下来了... 首先去官网下载 http://iolanguage.com 在页面下方的binaries那里找到自己系统对应的版本,我的是x64deb的,本来是下 ...
- 【LOJ2254】SNOI2017一个简单的询问
莫队,每次询问的是两个区间,就把区间拆开,分开来算就好了. 借鉴了rank1大佬的玄学排询问的姿势. #include<bits/stdc++.h> #define N 50010 typ ...
- VPS速度测试(4):上传下载速度、服务器带宽、Ping响应时间
1.VPS的速度好坏经常是我们选择某一个VPS商家的重要参考指标,对于国外的VPS主机我们可以执行以下命令来测试VPS入口带宽是多少. wget https://cachefly.cachefly.n ...
- 【linux】su和sudo命令的区别
来源:http://www.jb51.net/LINUXjishu/12713.html 一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比 ...
- Guava Cache 使用笔记
https://www.cnblogs.com/parryyang/p/5777019.html https://www.cnblogs.com/shoren/p/guava_cache.html J ...