ZOJ 3209 Treasure Map (DLX精确覆盖)
2015-08-26 09:21
513 查看
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int maxnode = 100010; const int MaxM = 1010; const int MaxN = 1010; struct DLX { int n,m,size; int U[maxnode],D[maxnode],R[maxnode],L[maxnode],Row[maxnode],Col[maxnode]; int H[MaxN], S[MaxM]; int ansd, ans[MaxN];//保存答案和解的方案 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-1; R[i] = i+1; } R[m] = 0; L[0] = m; size = m; for(int i = 1; i <= n; i++) H[i] = -1; } void Link(int r,int c) { ++S[Col[++size]=c]; Row[size] = r; D[size] = D[c]; U[D[c]] = size; U[size] = c; D[c] = size; if(H[r] < 0)H[r] = L[size] = R[size] = size; else { R[size] = R[H[r]]; L[R[H[r]]] = size; L[size] = H[r]; R[H[r]] = size; } } void remove(int c) { L[R[c]] = L[c]; R[L[c]] = R[c]; for(int i = D[c]; i != c; i = D[i]) for(int j = R[i]; j != i; j = R[j]) { U[D[j]] = U[j]; D[U[j]] = D[j]; --S[Col[j]]; } } void resume(int c) { for(int i = U[c]; i != c; i = U[i]) for(int j = L[i]; j != i; j = L[j]) ++S[Col[U[D[j]]=D[U[j]]=j]]; L[R[c]] = R[L[c]] = c; } //d为递归深度 void Dance(int d) { /*此处根据题目可考虑适当剪枝*/ if(R[0] == 0) { if(ansd == -1) ansd = d;//ansd初始化为-1,若可通过最后的值判断有没有解 else if(ansd > d) ansd = d;//寻找最优解,可根据题目更改条件 return ; } int c = R[0]; for(int i = R[0]; i != 0; i = R[i]) if(S[i] < S[c]) c = i; remove(c); for(int i = D[c]; i != c; i = D[i]) { ans[d] = Row[i];//记录解的方案 for(int j = R[i]; j != i; j = R[j])remove(Col[j]); Dance(d+1); for(int j = L[i]; j != i; j = L[j])resume(Col[j]); } resume(c); } }; DLX g; int main() { int T; int n,m,p; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&p); g.init(p,n*m); int x1,y1,x2,y2; for(int k = 1;k <= p;k++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); for(int i = x1+1;i <= x2;i++) for(int j = y1+1;j <= y2;j++) g.Link(k,j + (i-1)*m); } g.ansd = -1; g.Dance(0); printf("%d\n", g.ansd); } return 0; }
相关文章推荐
- js轮播功能 标签自动切换 同页面多轮播js
- 使用Core Graphics绘画一个山寨微信icon
- Linux源代码分析工具链
- Django登陆以后重定向到请求登陆的页面
- HTML5仿Apple Watch时钟动画
- 最小树形图 之 朱刘算法【模板】
- 慢慢说CSS第三天
- Intel DPDK 简要介绍
- Zabbix监控平台汉化修改
- MYSQL用户创建删除和权限问题
- GitHub contributions 统计规则
- Fence Repair POJ 3253
- ASP.NET Web API实践系列11,如何设计出优秀的API
- Masonry介绍与使用实践(快速上手Autolayout)
- C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
- mybatis和hibernate 对比
- poj 2249/1942 求组合数
- 新手程序员必读:推进编程工作的七条箴言
- msdn
- SAP财务管控(财务总监背后的管理大师)