hdu 2828 Lamp 重复覆盖
给n个灯和m个开关, 每个灯可以由若干个开关控制, 每个开关也可以控制若干个灯, 问你能否找到一种开关的状态, 使得所有的灯都亮。
将灯作为列, 然后把每个开关拆成两行, 开是一行, 关是一行。 然后跑一下就可以。 输出路径的话, 就是用一个vis数组记录一下哪些行被访问过。
- #include<bits/stdc++.h>
- using namespace std;
- #define pb(x) push_back(x)
- #define ll long long
- #define mk(x, y) make_pair(x, y)
- #define lson l, m, rt<<1
- #define mem(a) memset(a, 0, sizeof(a))
- #define rson m+1, r, rt<<1|1
- #define mem1(a) memset(a, -1, sizeof(a))
- #define mem2(a) memset(a, 0x3f, sizeof(a))
- #define rep(i, a, n) for(int i = a; i<n; i++)
- #define ull unsigned long long
- typedef pair<int, int> pll;
- const double PI = acos(-1.0);
- const double eps = 1e-;
- const int mod = 1e9+;
- const int inf = ;
- const int dir[][] = { {-, }, {, }, {, -}, {, } };
- const int maxn = ;
- const int maxNode = ;
- int num;
- struct DLX {
- int L[maxNode], R[maxNode], U[maxNode], D[maxNode], row[maxNode], col[maxNode];
- int S[maxn], H[maxn], sz, n, m, vis[maxn*];
- void remove(int c) {
- for(int i = D[c]; i!=c; i = D[i]) {
- L[R[i]] = L[i];
- R[L[i]] = R[i];
- }
- }
- void resume(int c) {
- for(int i = U[c]; i!=c; i = U[i]) {
- L[R[i]] = i;
- R[L[i]] = i;
- }
- }
- int dfs(int d) {
- if(R[] == ) {
- return ;
- }
- int c = R[];
- for(int i = R[]; i!=; i = R[i])
- if(S[c]>S[i])
- c = i;
- for(int i = D[c]; i!=c; i = D[i]) {
- if(vis[row[i]^])
- continue;
- remove(i);
- vis[row[i]] = ;
- for(int j = R[i]; j != i; j = R[j])
- remove(j);
- if(dfs(d+))
- return ;
- for(int j = L[i]; j != i; j = L[j])
- resume(j);
- resume(i);
- vis[row[i]] = ;
- }
- return ;
- }
- void add(int r, int c) {
- sz++;
- row[sz] = r;
- col[sz] = c;
- S[c]++;
- U[sz] = U[c];
- D[sz] = c;
- D[U[c]] = sz;
- U[c] = sz;
- if(~H[r]) {
- R[sz] = H[r];
- L[sz] = L[H[r]];
- L[R[sz]] = sz;
- R[L[sz]] = sz;
- } else {
- H[r] = L[sz] = R[sz] = sz;
- }
- }
- void init() {
- mem1(H);
- for(int i = ; i<=n; i++) {
- R[i] = i+;
- L[i] = i-;
- U[i] = i;
- D[i] = i;
- }
- mem(S);
- R[n] = ;
- L[] = n;
- sz = n;
- }
- void solve() {
- init();
- mem(vis);
- int x, y;
- char s[];
- for(int i = ; i <= n; i++) {
- scanf("%d", &x);
- while(x--) {
- scanf("%d%s", &y, s);
- if(s[] == 'N') {
- add(y<<, i);
- } else {
- add(y<<|, i);
- }
- }
- }
- if(dfs()) {
- for(int i = ; i <= m-; i ++) {
- if(vis[i<<]) {
- printf("ON ");
- } else {
- printf("OFF ");
- }
- }
- if(vis[*m]) {
- puts("ON");
- } else {
- puts("OFF");
- }
- } else {
- puts("-1");
- }
- }
- }dlx;
- int main()
- {
- while(~scanf("%d%d", &dlx.n, &dlx.m)) {
- dlx.solve();
- }
- return ;
- }
hdu 2828 Lamp 重复覆盖的更多相关文章
- hdu 3498 whosyourdaddy 重复覆盖
题目链接 重复覆盖的入门题, 和精确覆盖不一样, 删除的时候只删除一行多列. #include<bits/stdc++.h> using namespace std; #define pb ...
- (中等) HDU 3335 , DLX+重复覆盖。
Description As we know,the fzu AekdyCoin is famous of math,especially in the field of number theory. ...
- hdu 2295 dlx重复覆盖+二分答案
题目大意: 有一堆雷达工作站,安放至多k个人在这些工作站中,找到一个最小的雷达监控半径可以使k个工作人所在的雷达工作站覆盖所有城市 二分半径的答案,每次利用dlx的重复覆盖来判断这个答案是否正确 #i ...
- HDU 2295 Radar 重复覆盖 DLX
题意: N个城市,M个雷达站,K个操作员,问雷达的半径至少为多大,才能覆盖所有城市.M个雷达中最多只能有K个同时工作. 思路: 二分雷达的半径,看每个雷达可以覆盖哪些城市,然后做重复覆盖,判断这个半径 ...
- [DLX反复覆盖] hdu 2828 Lamp
题意: 有N个灯M个开关 每一个灯的ON和OFF状态都能控制一个灯是否亮 给出N行,代表对于每一个灯 哪些开关的哪个状态能够使得第i个灯亮 思路: 这里须要注意一个问题 假设开关1的ON 状态和开关2 ...
- HDU 2828 Lamp 二分图的最大匹配 模型题
http://acm.hdu.edu.cn/showproblem.php?pid=2828 给定n个灯,m个开关,使得每栈灯亮,前提是控制这栈灯的开关的状态是其中一个.(题目应该都看得懂) 其实我想 ...
- (中等) HDU 2295 , DLX+重复覆盖+二分。
Description N cities of the Java Kingdom need to be covered by radars for being in a state of war. S ...
- hdu 2295 Radar 重复覆盖+二分
题目链接 给m个雷达, n个城市, 以及每个城市的坐标, m个雷达里只能使用k个, 在k个雷达包围所有城市的前提下, 求最小半径. 先求出每个雷达到所有城市的距离, 然后二分半径, 如果距离小于二分的 ...
- HDU 2295 Radar (重复覆盖)
Radar Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- VirtualBox镜像复制载入
转发:http://blog.csdn.net/dotuian/article/details/9127229 一,虚拟镜像文件格式 VirtualBox磁盘镜像文件(VDI, VMDK, VHD, ...
- uinavagation 透明代码
NSShadow *shadow = [[NSShadow alloc] init]; [shadow setShadowOffset:CGSizeMake(1, 1)]; [shadow setSh ...
- 动态获取UIWebView的真正高度
场景 在 App 中使用UIWebView加载网页, 与原生的 UI 显示在一起,一般情况下,webView 的 内容一页是肯定不够的,换句话说,webView 的高度是不定的,那如果原生的 UI是一 ...
- DRBD脑裂解决方法
1.查看主服务器 [root@master ~]# /etc/init.d/drbd status drbd driver loaded OK; device status: version: (ap ...
- requirejs + vue 项目搭建2
上篇是年后的项目搭建的,时间比较仓促,感觉有点low 1.gulp-vue 文件对公用js的有依赖,以后别的同事拿去搭其他项目,估计会被喷 2.不支持vue-loader一样写模版语言和es6语法 最 ...
- 在windows下,git webhook使用php拉取代码的学习总结
原来上传代码到测试服务器都是用ftp,我觉得这种方式很低效,而且容易出错,比如忘记传某个修改过文件. 现在项目的代码放在了git@osc上了,想使用他webhook,每当有push的时候,git@os ...
- 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 ? ...
- python 自定义信号处理器
说明: 这里所说的信号与kill 命令中的信号指的是同一个. #!/usr/bin/python #!coding:utf-8 import sys,time,signal def now(): re ...
- Linux07--Shell程序设计03 通配符与正则表达式
通配符 通配符可用于代替字符. 通常地,星号“*”匹配0个或以上的字符,问号“?”匹配1个字符. 使用情况: 1.文件和目录 在CP/M.DOS.Microsoft Windows和类Unix操作系统 ...
- 未能加载文件 %CommonDir%\dte90a.olb。未能找到该文件,因此解决此问题的尝试失败
分类: 日常应用问题 2012-08-04 10:53 914人阅读 评论(0) 收藏 举报 microsoft2010c vs2010 启动时提示 ------------------------- ...