题目大意:

有一些灯,有些开关可以控制这些灯,给出矩阵表示控制

对于矩阵中的a i j 表示第i个开关控制第j个灯的情况

若元素为1 表示当灯开着的时候,关掉灯

若元素为0 表示无操作

若元素为-1 表示当灯关着的时候,打开灯

思路:

因为灯的数量很小

我们可以将所有灯的状态用二进制来表示

然后我们跑一下所有状态的spfa

位运算记错了毁一生:

| 或 有一个是1就为1

^ 异或 不一样就为1

& 与 两个都是1才为1

~(1<<j) 表示除了第j位全部为1

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#define inf 2147483647
#define ll long long
#define MOD 1000000000
#define MAXN 22
using namespace std;
inline int read()
{
int x=,f=;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,dis[MAXN*],cnt;
bool vis[MAXN*];
short map[MAXN*][MAXN];
int spfa()
{
queue <int> q;
int tmp;
q.push(cnt);vis[cnt]=;
dis[cnt]=;
while(!q.empty())
{
int k=q.front();
q.pop();
for(int i=;i<=m;i++)
{
tmp=k;
for(int j=;j<n;j++)
{
if(map[i][j]==) tmp=tmp&(~(<<j));
if(map[i][j]==-) tmp=tmp|(<<j);
}
if(dis[tmp]>dis[k]+)
{
dis[tmp]=dis[k]+;
if(!vis[tmp]) {vis[tmp]=;q.push(tmp);}
}
}
vis[k]=;
}
if(dis[]>=*MOD) return -;
return dis[];
}
int main()
{
n=read(),m=read();
for(int i=;i<=m;i++)
for(int j=;j<n;j++) map[i][j]=read();
memset(dis,,sizeof(dis));
cnt=(<<n)-;
printf("%d",spfa());
}

luogu 2622 关灯问题II的更多相关文章

  1. luogu p2622关灯问题II

    luogu p2622关灯问题II 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[ ...

  2. 状压DP【p2622】 关灯问题II

    题目描述--->P2622 关灯问题II 没用的话: 首先第一眼看到题,嗯?n<=10?搜索? 满心欢喜地敲了一通搜索. 交上去,Wa声一片? 全部MLE! 这么坑人神奇? 一想,可能是爆 ...

  3. P2622 关灯问题II(状压bfs)

    P2622 关灯问题II 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j] ...

  4. 关灯问题II 状压DP

    关灯问题II 状压DP \(n\)个灯,\(m\)个按钮,每个按钮都会对每个灯有不同影响,问最少多少次使灯熄完. \(n\le 10,m\le 100\) 状压DP的好题,体现了状压的基本套路与二进制 ...

  5. [状压DP]关灯问题II

    关 灯 问 题 I I 关灯问题II 关灯问题II 题目描述 现有n盏灯,以及 m m m个按钮.每个按钮可以同时控制这 n n n盏灯--按下了第 i i i个按钮,对于所有的灯都有一个效果.按下i ...

  6. 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  7. P2622 关灯问题II (状态压缩入门)

    题目链接: https://www.luogu.org/problemnew/show/P2622 具体思路:暴力,尝试每个开关,然后看所有的情况中存不存在灯全部关闭的情况,在储存所有灯的情况的时候, ...

  8. 洛谷 P2622 关灯问题II【状压DP】

    传送门:https://www.luogu.org/problemnew/show/P2622 题面: 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的 ...

  9. 洛谷 P2622 关灯问题II(状压DP入门题)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个 ...

随机推荐

  1. 第二次 Ubuntu16.04 vi编辑器的方向键和退格问题

    新安装ubuntu后,好多人可能都碰到过这样的问题,vi对文件进行编辑时,上下左右键变成了ABDC,退格键也不管用. 解决办法其实也很简单,首先卸载掉旧的vim-common. apt-get rem ...

  2. Django之ORM操作(***)

    Django之ORM操作(***) http请求的流程: url--> 视图view(模板+数据库) --> ORM的功能: 可以转换SQL语句,并做操作. ORM操作数据表: -创建表: ...

  3. 2. Java中的垃圾收集 - GC参考手册

    标记-清除(Mark and Sweep)是最经典的垃圾收集算法.将理论用于生产实践时, 会有很多需要优化调整的地点, 以适应具体环境.下面通过一个简单的例子, 让我们一步步记录下来, 看看如何才能保 ...

  4. sqlserver同一个局域网内,把服务器数据库备份到客户端

    1.客户端主机创建网络共享文件夹 2.远程服务器运行: EXEC sp_configure 'show advanced options', 1;-- 允许配置高级选项--配置选项'show adva ...

  5. NioEventLoop.run select处理IO事件(boss/worker)流程:

    NioEventLoop.run select处理IO事件(boss/worker)流程:processSelectedKeysprocessSelectedKeysOptimizedprocessS ...

  6. 2016 Multi-University Training Contest 3-1011.Teacher Bo,暴力!

    Teacher Bo                                                         Time Limit: 4000/2000 MS (Java/Ot ...

  7. 2018/2/27 Activiti教程之创建流程篇(与Springboot整合版)一

    因为电脑还在托运中,现在手上这台垃圾电脑实在是没法玩微服务,所以趁着这两天玩玩Activiti吧. 说实话,在学习Activiti中走了N多弯路,最大的原因就是网上没有一个完整(好)的教程,甚至连官方 ...

  8. scp远程文件传输

    第一次.提示下载公钥 [root@rhel5 ~]# scp install.log root@192.168.124.129:/tmp The authenticity of host '192.1 ...

  9. CALayer之 customizing timing of an animation

    customizing timing of an animation Timing is an important part of animations, and with Core Animatio ...

  10. spring boot file上传

    用Spring Boot写读取Excel文件小工具的时候遇到的一些小坑已经填平,复制即可满足普通的文件上传功能POI方面只需一个包,其他通用包工程中一般都会带TIPS:前端为了扩展我用ajax异步请求 ...