题意:

有N个灯M个开关

每一个灯的ON和OFF状态都能控制一个灯是否亮

给出N行,代表对于每一个灯

哪些开关的哪个状态能够使得第i个灯亮

思路:

这里须要注意一个问题

假设开关1的ON 状态和开关2的ON状态能使得1号灯亮

那么开关1、2同一时候处于ON的时候 1号灯也是亮的。意思就是仅仅要有一个开关使得灯亮,灯就亮了。

简单的DLX 反复覆盖

行为每一个开关的两个状态2*m行,列为n个灯

在搜索的同一时候标记一下哪个开关被用过了

那么还有一个状态也不能用了

代码:

#include"stdio.h"
#include"algorithm"
#include"string.h"
#include"iostream"
#include"queue"
#include"map"
#include"vector"
#include"string"
using namespace std;
#define N 1005*1005
#define RN 1005
#define CN 1005
int us[RN];
struct DLX
{int n,m,C;int U[N],D[N],L[N],R[N],Row[N],Col[N];int H[RN],S[CN],cnt,ans[RN];void init(int _n,int _m){n=_n;m=_m;for(int i=0; i<=m; i++){S[i]=0;U[i]=D[i]=i;L[i]=(i==0?

m:i-1); R[i]=(i==m?0:i+1); } C=m; for(int i=1; i<=n; i++) H[i]=-1; } void link(int x,int y) { C++; Row[C]=x; Col[C]=y; S[y]++; U[C]=U[y]; D[C]=y; D[U[y]]=C; U[y]=C; if(H[x]==-1) H[x]=L[C]=R[C]=C; else { L[C]=L[H[x]]; R[C]=H[x]; R[L[H[x]]]=C; L[H[x]]=C; } } void del(int x) { for(int i=D[x]; i!=x; i=D[i]) { R[L[i]]=R[i]; L[R[i]]=L[i]; } } void rec(int x) { for(int i=U[x]; i!=x; i=U[i]) { R[L[i]]=i; L[R[i]]=i; } } int used[CN]; int h() { int sum=0; for(int i=R[0]; i!=0; i=R[i]) used[i]=0; for(int i=R[0]; i!=0; i=R[i]) { if(used[i]==0) { sum++; used[i]=1; for(int j=D[i]; j!=i; j=D[j]) for(int k=R[j]; k!=j; k=R[k]) used[Col[k]]=1; } } return sum; } int dance(int x) { //if(x+h()>=cnt) return 0; if(R[0]==0) { cnt=x; // cnt=min(cnt,x); return 1; } int now=R[0]; for(int i=R[0]; i!=0; i=R[i]) { if(S[i]<S[now]) now=i; } for(int i=D[now]; i!=now; i=D[i]) { if(us[(Row[i]-1)/2+1]==0) { us[(Row[i]-1)/2+1]=1; del(i); ans[x]=Row[i]; for(int j=R[i]; j!=i; j=R[j]) del(j); if(dance(x+1)) return 1; for(int j=L[i]; j!=i; j=L[j]) rec(j); rec(i); us[(Row[i]-1)/2+1]=0; } } return 0; } } dlx; int main() { int n,m; while(scanf("%d%d",&n,&m)!=-1) { dlx.init(2*m,n); for(int i=1; i<=n; i++) { int k; scanf("%d",&k); while(k--) { int x; char y[21]; scanf("%d%s",&x,y); int tep=x*2-1; if(strcmp(y,"OFF")==0) tep++; dlx.link(tep,i); } } memset(us,0,sizeof(us)); int f=dlx.dance(0); if(f==0) puts("-1"); else { memset(us,0,sizeof(us)); for(int i=0;i<dlx.cnt;i++) { us[(dlx.ans[i]-1)/2+1]=dlx.ans[i]%2; } for(int i=1;i<=m;i++) printf(i==m?"%s\n":"%s ",us[i]==0?"OFF":"ON"); } } return 0; }

[DLX反复覆盖] hdu 2828 Lamp相关推荐

  1. FZU 1686 神龙的难题(DLX反复覆盖)

    FZU 1686 神龙的难题 题目链接 题意:中文题 思路:每个1看成列,每个位置作为左上角的矩阵看成行.dlx反复覆盖就可以 代码: #include <cstdio> #include ...

  2. [DLX重复覆盖] hdu 3498 whosyourdaddy

    题意: 给N个怪,M个关系. 每个关系代表a和b是邻居. 然后问每次攻击你可以攻击一个怪以及它的全部邻居 问最少需要几次攻击能把怪全部杀死. 思路: 怪为行和列,然后对面每个怪的邻居都是这个怪的列建图 ...

  3. hdu - 3498 - whosyourdaddy(反复覆盖DLX)

    题意:N(2 ≤ N ≤ 55)个点,M(0 ≤ M ≤ N*N)条无向边,删除一个点会把与其相邻的点一起删掉.问最少删几次能够删掉全部点. 题目链接:http://acm.hdu.edu.cn/sh ...

  4. hdu 2295 Radar DLX 重复覆盖问题

    http://acm.hdu.edu.cn/showproblem.php?pid=229 题意: 一个国家有n个城市,m个雷达,我们同时操作的雷达数最多为k,给出城市与国家的坐标,求小于等于k的操作 ...

  5. HDU 3498 whosyourdaddy DLX重复覆盖

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=3498 题意: 有 n n个敌人,其中有mm对敌人互为邻居,当你攻击杀死一个敌人时,同时会杀死它所有的邻居 ...

  6. DLX精确覆盖 hdu4069 Squiggly Sudoku

    传送门:点击打开链接 题意:将9*9的棋盘分割成了9个部分,每个部分都是9个格子,然后现在要求每个部分的数字恰是1~9的排列,每一行每一列恰是1~9的排列,问是否有解,有多少组解,如果只有1组解打印出 ...

  7. HDU 3498 whosyourdaddy(DLX重复覆盖)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3498         n个点,m条无向边,删除一个点会把与其相邻的点一起删掉,问最少删几次可以删掉所有 ...

  8. HDU 4069 Squiggly Sudoku DLX 精确覆盖

    题意: 数独问题,给你9个连通块,每个连通块有9个位置. 现在已经有一些数字在上面,让你在空的位置上放数字. 问你是否存在方案,使得每个连通块包含1~9,并且每行每列都有1~9的数字. 输出结果参照样 ...

  9. HDU - 2828 网络流

    题目大意 有n个灯,m个开关,由于线路乱接导致可能有多个开关对应一个灯(并联),有的灯在开关开的时候亮 有的灯在开关关的时候亮,[每个开关最多对应两盏灯],试找出一种开关的ON,OFF状态,使得所有灯 ...

最新文章

  1. 服务器 上传文件 杀毒,一种实现文件上传网站后自动进行杀毒的方法及系统
  2. 你不得不知道的Visual Studio 2012(3)- 创建Windows应用程序
  3. axure如何页面滑动时广告位上移_新手APP运营如何做广告位投放
  4. 智能机维修暴利大起底:触摸屏成本30维修300元
  5. kali linux学习入门- Chrome浏览器安装,可以正常打开
  6. 图解TCPIP-DNS
  7. Linux系统下如何配置SSH?如何开启SSH?
  8. Learning-Python【1】:交互式环境与变量的使用
  9. 控制工程——传递函数与状态方程
  10. 如何修复rpc服务器,打印时弹出RPC服务器不可用修复教程
  11. Kafka 之 HW 与 LEO
  12. 线粒体DNA(mtDNA)捕获探针panel试剂盒myBaits Expert Mito,适用各种样本类型(包含降解和环境DNA,化石或博物馆样本均可),应用于遗传学研究
  13. 如何设计出优秀的EDM邮件营销模板
  14. 如何批量调整Word中mathtype公式的大小
  15. full outer join应用场景
  16. 深入理解 Comparable 接口和 Comparator 接口以及Arrays.sort()
  17. 基础算法:Hanoi塔(递归)
  18. 图书信息管理系统c语言txt,小型图书信息管理系统(C语言)
  19. LeetCode 1155. 掷骰子的N种方法 每日一题
  20. python跳出双层循环

热门文章

  1. 廖雪峰说python_廖雪峰官网Python部分的疑问及解决
  2. keystore文件_如何手动给APK文件签名
  3. php读取文件和读取redis,本地测试读取redis和普通文件缓存的速度,redis慢一倍?...
  4. linux系统安装金蝶_linux 操作系统安装配置vnc
  5. rowid 对应mysql_请教一下相当于MySQL中Oracle的RowID
  6. 计算机网络及公文写作知识,计算机网络期末复习题
  7. DjangoFreshStore项目一
  8. Django新建项目
  9. mybatis传参数
  10. js控制table中tr位置互换