直接精确覆盖

开始逐行添加超时了,换成了单点添加

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std; #define FOR(i,A,s) for(int i = A[s]; i != s; i = A[i])
#define exp 1e-8 const int MAX = ;
int n, m, k, t, len; struct DLX {
int n, Size;//Size为尾指针,真正大小
int row[MAX], col[MAX];//记录每个点的行列
int U[MAX], D[MAX], R[MAX], L[MAX]; //4个链表
int S[MAX],H[MAX];//每列1的个数
int ncnt, ans[MAX];
void init (int n) {
this->n = n;
ncnt = MAX;
//增加n+1个辅助链表,从0到n
for (int i = ; i <= n; i++)
U[i] = D[i] = i, L[i] = i - , R[i] = i + ,S[i]=;
R[n] = , L[] = n; //头尾相接
Size = n + ;
memset (H, -, sizeof H);
}
//单点添加
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] < ) 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 (i, D, c)
FOR (j, R, i)
U[D[j]] = U[j], D[U[j]] = D[j], --S[col[j]];
// //重复覆盖
// for (int i = D[c]; i != c; i = D[i])
// L[R[i]] = L[i], R[L[i]] = R[i];
}
void Restore (int c) {
FOR (i, U, c)
FOR (j, L, i)
++S[col[j]], U[D[j]] = j, D[U[j]] = j;
L[R[c]] = c, R[L[c]] = c;
//重复覆盖
// for (int i = U[c]; i != c; i = U[i])
// L[R[i]] = R[L[i]] = i;
}
bool v[MAX];
int ff() {
int ret = ;
for (int c = R[]; c != ; c = R[c]) v[c] = true;
for (int c = R[]; c != ; c = R[c])
if (v[c])
{
ret++;
v[c] = false;
for (int i = D[c]; i != c; i = D[i])
for (int j = R[i]; j != i; j = R[j])
v[col[j]] = false;
}
return ret;
}
bool dfs (int d) {
if (d >= ncnt) return ;
//if (d + ff() > k) return 0;//重复覆盖
if (R[] == ) {
ncnt = min (ncnt, d);
return ;
}
int c = R[];
for (int i = R[]; i != ; i = R[i])
if (S[i] < S[c])
c = i;
Remove (c);//精确覆盖
FOR (i, D, c) {
//Remove (i);//重复覆盖
ans[d] = row[i];
FOR (j, R, i) Remove (col[j]);//精确覆盖
//FOR (j, R, i) Remove (j);//重复覆盖
//if (dfs (d + 1) ) return 1;
dfs (d + );
FOR (j, L, i) Restore (col[j]);//精确覆盖
//FOR (j, L, i) Restore (j);//重复覆盖
//Restore (i);//重复覆盖
}
Restore (c);//精确覆盖
return ;
}
bool solve (vector<int> &v) {
v.clear();
if (!dfs () ) return ;
for (int i = ; i < ncnt; i++) v.push_back (ans[i]);
return ;
}
} Dance;
int columns[][ * ];
int main() {
scanf ("%d", &t);
while (t--) {
memset (columns, , sizeof columns);
scanf ("%d %d %d", &n, &m, &k);
len = n * m;
Dance.init (len);
int x,y,xx,yy;
for (int p = ; p <= k; p++) {
scanf ("%d %d %d %d", &x, &y, &xx, &yy);
for (int i = x+; i <= xx; i++)
for (int j = y+; j <= yy; j++)
Dance.Link (p, j + (i-)*m);
}
Dance.dfs ();
printf ("%d\n", Dance.ncnt == MAX ? - : Dance.ncnt);
}
return ;
}

zoj 3209.Treasure Map(DLX精确覆盖)的更多相关文章

  1. (简单) ZOJ 3209 Treasure Map , DLX+精确覆盖。

    Description Your boss once had got many copies of a treasure map. Unfortunately, all the copies are ...

  2. zoj - 3209 - Treasure Map(精确覆盖DLX)

    题意:一个 n x m 的矩形(1 <= n, m <= 30),现给出这个矩形中 p 个(1 <= p <= 500)子矩形的左下角与右下角坐标,问最少用多少个子矩形能够恰好 ...

  3. ZOJ 3209 Treasure Map(精确覆盖)

    Treasure Map Time Limit: 2 Seconds      Memory Limit: 32768 KB Your boss once had got many copies of ...

  4. ZOJ 3209 Treasure Map DLX

    用最少的矩阵覆盖n*m的地图.注意矩阵不能互相覆盖. 这里显然是一个精确覆盖,但因为矩阵拼接过程中,有公共的边,这里须要的技巧就是把矩阵的左边和以下截去一个单位. #include <stdio ...

  5. ZOJ 3209 Treasure Map 精确覆盖

    题目链接 精确覆盖的模板题, 把每一个格子当成一列就可以. S忘记初始化TLE N次, 哭晕在厕所...... #include<bits/stdc++.h> using namespac ...

  6. ZOJ 3209 Treasure Map (Dancing Links 精确覆盖 )

    题意 :  给你一个大小为 n * m 的矩形 , 坐标是( 0 , 0 ) ~ ( n , m )  .然后给你 p 个小矩形 . 坐标是( x1 , y1 ) ~ ( x2 , y2 ) , 你选 ...

  7. ZOJ 3209 Treasure Map (Dancing Links)

    Treasure Map Time Limit: 2 Seconds      Memory Limit: 32768 KB Your boss once had got many copies of ...

  8. ZOJ 3209 Treasure Map (Dancing Links)

    Treasure Map Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit S ...

  9. DLX精确覆盖与重复覆盖模板题

    hihoCoder #1317 : 搜索四·跳舞链 原题地址:http://hihocoder.com/problemset/problem/1317 时间限制:10000ms 单点时限:1000ms ...

随机推荐

  1. (转载)在vmware中简单配置vsftpd服务器

    (转载)http://blog.chinaunix.net/uid-7453676-id-2625582.html 分类: LINUX 一 试验的前期环境搭建   系统环境:Fedora 2   软件 ...

  2. Delphi Web Service和ISAPI的区别与联系 转

    Web Service和ISAPI的区别与联系   1.Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service ...

  3. HDOJ(HDU) 2520 我是菜鸟,我怕谁(等差数列)

    Problem Description lin2144是一只小菜鸟,都是笨鸟先飞,lin2144想来个菜鸟先飞,他从0点出发 一开始的飞行速度为1m/s,每过一个单位时间lin2144的飞行速度比上一 ...

  4. codevs 1421 秋静叶&秋穣子(树上DP+博弈)

    1421 秋静叶&秋穣子   题目描述 Description 在幻想乡,秋姐妹是掌管秋天的神明,作为红叶之神的姐姐静叶和作为丰收之神的妹妹穰子.如果把红叶和果实联系在一 起,自然会想到烤红薯 ...

  5. Django中的Form(二)

    一.保存用户输入内容 如果用户输入一张表单提交后出现错误时,会出现重现填写的情况.我们可以把用户输入的信息保存下来,并返回到前台页面,这样用户就无需再次输入. views.py # coding:ut ...

  6. poj 1847 Tram【spfa最短路】

    Tram Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12005   Accepted: 4365 Description ...

  7. Eclipse 为jar包加入 Java Source和Javadoc(如何向Eclipse中导入源码和doc)

    : 当我们在MyEclipse中加入Struct,只是引入了jar包,这时使用jar包里面的类,是无法看到源码的,看到的只是这样 是反编译后的一些东西 加入源码 那么如果看到源码呢,就需要导入了 找到 ...

  8. 常用Dos命令笔记

    0x00 磁盘FAT32格式转NTFS convert e: /fs:ntfs Tips: 语法规则: Converts a FAT volume to NTFS. CONVERT volume /F ...

  9. ASP.NET中的文件上传大小限制的问题

    一.文件大小限制的问题 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文 ...

  10. JSON 和 JSONP

    本文转载:http://www.cnblogs.com/shanyou/archive/2009/12/13/1623163.html JSON 和 JSONP  浏览器安全模型规定,XMLHttpR ...