题目链接

给n个灯和m个开关, 每个灯可以由若干个开关控制, 每个开关也可以控制若干个灯, 问你能否找到一种开关的状态, 使得所有的灯都亮。

将灯作为列, 然后把每个开关拆成两行, 开是一行, 关是一行。 然后跑一下就可以。 输出路径的话, 就是用一个vis数组记录一下哪些行被访问过。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define pb(x) push_back(x)
  4. #define ll long long
  5. #define mk(x, y) make_pair(x, y)
  6. #define lson l, m, rt<<1
  7. #define mem(a) memset(a, 0, sizeof(a))
  8. #define rson m+1, r, rt<<1|1
  9. #define mem1(a) memset(a, -1, sizeof(a))
  10. #define mem2(a) memset(a, 0x3f, sizeof(a))
  11. #define rep(i, a, n) for(int i = a; i<n; i++)
  12. #define ull unsigned long long
  13. typedef pair<int, int> pll;
  14. const double PI = acos(-1.0);
  15. const double eps = 1e-;
  16. const int mod = 1e9+;
  17. const int inf = ;
  18. const int dir[][] = { {-, }, {, }, {, -}, {, } };
  19. const int maxn = ;
  20. const int maxNode = ;
  21. int num;
  22. struct DLX {
  23. int L[maxNode], R[maxNode], U[maxNode], D[maxNode], row[maxNode], col[maxNode];
  24. int S[maxn], H[maxn], sz, n, m, vis[maxn*];
  25. void remove(int c) {
  26. for(int i = D[c]; i!=c; i = D[i]) {
  27. L[R[i]] = L[i];
  28. R[L[i]] = R[i];
  29. }
  30. }
  31. void resume(int c) {
  32. for(int i = U[c]; i!=c; i = U[i]) {
  33. L[R[i]] = i;
  34. R[L[i]] = i;
  35. }
  36. }
  37. int dfs(int d) {
  38. if(R[] == ) {
  39. return ;
  40. }
  41. int c = R[];
  42. for(int i = R[]; i!=; i = R[i])
  43. if(S[c]>S[i])
  44. c = i;
  45. for(int i = D[c]; i!=c; i = D[i]) {
  46. if(vis[row[i]^])
  47. continue;
  48. remove(i);
  49. vis[row[i]] = ;
  50. for(int j = R[i]; j != i; j = R[j])
  51. remove(j);
  52. if(dfs(d+))
  53. return ;
  54. for(int j = L[i]; j != i; j = L[j])
  55. resume(j);
  56. resume(i);
  57. vis[row[i]] = ;
  58. }
  59. return ;
  60. }
  61. void add(int r, int c) {
  62. sz++;
  63. row[sz] = r;
  64. col[sz] = c;
  65. S[c]++;
  66. U[sz] = U[c];
  67. D[sz] = c;
  68. D[U[c]] = sz;
  69. U[c] = sz;
  70. if(~H[r]) {
  71. R[sz] = H[r];
  72. L[sz] = L[H[r]];
  73. L[R[sz]] = sz;
  74. R[L[sz]] = sz;
  75. } else {
  76. H[r] = L[sz] = R[sz] = sz;
  77. }
  78. }
  79. void init() {
  80. mem1(H);
  81. for(int i = ; i<=n; i++) {
  82. R[i] = i+;
  83. L[i] = i-;
  84. U[i] = i;
  85. D[i] = i;
  86. }
  87. mem(S);
  88. R[n] = ;
  89. L[] = n;
  90. sz = n;
  91. }
  92. void solve() {
  93. init();
  94. mem(vis);
  95. int x, y;
  96. char s[];
  97. for(int i = ; i <= n; i++) {
  98. scanf("%d", &x);
  99. while(x--) {
  100. scanf("%d%s", &y, s);
  101. if(s[] == 'N') {
  102. add(y<<, i);
  103. } else {
  104. add(y<<|, i);
  105. }
  106. }
  107. }
  108. if(dfs()) {
  109. for(int i = ; i <= m-; i ++) {
  110. if(vis[i<<]) {
  111. printf("ON ");
  112. } else {
  113. printf("OFF ");
  114. }
  115. }
  116. if(vis[*m]) {
  117. puts("ON");
  118. } else {
  119. puts("OFF");
  120. }
  121. } else {
  122. puts("-1");
  123. }
  124. }
  125. }dlx;
  126. int main()
  127. {
  128. while(~scanf("%d%d", &dlx.n, &dlx.m)) {
  129. dlx.solve();
  130. }
  131. return ;
  132. }

hdu 2828 Lamp 重复覆盖的更多相关文章

  1. hdu 3498 whosyourdaddy 重复覆盖

    题目链接 重复覆盖的入门题, 和精确覆盖不一样, 删除的时候只删除一行多列. #include<bits/stdc++.h> using namespace std; #define pb ...

  2. (中等) HDU 3335 , DLX+重复覆盖。

    Description As we know,the fzu AekdyCoin is famous of math,especially in the field of number theory. ...

  3. hdu 2295 dlx重复覆盖+二分答案

    题目大意: 有一堆雷达工作站,安放至多k个人在这些工作站中,找到一个最小的雷达监控半径可以使k个工作人所在的雷达工作站覆盖所有城市 二分半径的答案,每次利用dlx的重复覆盖来判断这个答案是否正确 #i ...

  4. HDU 2295 Radar 重复覆盖 DLX

    题意: N个城市,M个雷达站,K个操作员,问雷达的半径至少为多大,才能覆盖所有城市.M个雷达中最多只能有K个同时工作. 思路: 二分雷达的半径,看每个雷达可以覆盖哪些城市,然后做重复覆盖,判断这个半径 ...

  5. [DLX反复覆盖] hdu 2828 Lamp

    题意: 有N个灯M个开关 每一个灯的ON和OFF状态都能控制一个灯是否亮 给出N行,代表对于每一个灯 哪些开关的哪个状态能够使得第i个灯亮 思路: 这里须要注意一个问题 假设开关1的ON 状态和开关2 ...

  6. HDU 2828 Lamp 二分图的最大匹配 模型题

    http://acm.hdu.edu.cn/showproblem.php?pid=2828 给定n个灯,m个开关,使得每栈灯亮,前提是控制这栈灯的开关的状态是其中一个.(题目应该都看得懂) 其实我想 ...

  7. (中等) HDU 2295 , DLX+重复覆盖+二分。

    Description N cities of the Java Kingdom need to be covered by radars for being in a state of war. S ...

  8. hdu 2295 Radar 重复覆盖+二分

    题目链接 给m个雷达, n个城市, 以及每个城市的坐标, m个雷达里只能使用k个, 在k个雷达包围所有城市的前提下, 求最小半径. 先求出每个雷达到所有城市的距离, 然后二分半径, 如果距离小于二分的 ...

  9. HDU 2295 Radar (重复覆盖)

    Radar Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. VirtualBox镜像复制载入

    转发:http://blog.csdn.net/dotuian/article/details/9127229 一,虚拟镜像文件格式 VirtualBox磁盘镜像文件(VDI, VMDK, VHD, ...

  2. uinavagation 透明代码

    NSShadow *shadow = [[NSShadow alloc] init]; [shadow setShadowOffset:CGSizeMake(1, 1)]; [shadow setSh ...

  3. 动态获取UIWebView的真正高度

    场景 在 App 中使用UIWebView加载网页, 与原生的 UI 显示在一起,一般情况下,webView 的 内容一页是肯定不够的,换句话说,webView 的高度是不定的,那如果原生的 UI是一 ...

  4. DRBD脑裂解决方法

    1.查看主服务器 [root@master ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: (ap ...

  5. requirejs + vue 项目搭建2

    上篇是年后的项目搭建的,时间比较仓促,感觉有点low 1.gulp-vue 文件对公用js的有依赖,以后别的同事拿去搭其他项目,估计会被喷 2.不支持vue-loader一样写模版语言和es6语法 最 ...

  6. 在windows下,git webhook使用php拉取代码的学习总结

    原来上传代码到测试服务器都是用ftp,我觉得这种方式很低效,而且容易出错,比如忘记传某个修改过文件. 现在项目的代码放在了git@osc上了,想使用他webhook,每当有push的时候,git@os ...

  7. linux命令学习03-grep

    实例1.查找某个进程 #ps -ef | grep ssh root 1771 1 0 12:07 ? 00:00:00 /usr/sbin/sshdroot 2362 1771 0 16:34 ? ...

  8. python 自定义信号处理器

    说明: 这里所说的信号与kill 命令中的信号指的是同一个. #!/usr/bin/python #!coding:utf-8 import sys,time,signal def now(): re ...

  9. Linux07--Shell程序设计03 通配符与正则表达式

    通配符 通配符可用于代替字符. 通常地,星号“*”匹配0个或以上的字符,问号“?”匹配1个字符. 使用情况: 1.文件和目录 在CP/M.DOS.Microsoft Windows和类Unix操作系统 ...

  10. 未能加载文件 %CommonDir%\dte90a.olb。未能找到该文件,因此解决此问题的尝试失败

    分类: 日常应用问题 2012-08-04 10:53 914人阅读 评论(0) 收藏 举报 microsoft2010c vs2010 启动时提示 ------------------------- ...