欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解

题目

精确覆盖问题模板题

算法

DLX算法

学习DLX算法--传送门

代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=+,M=+;
struct X{
int L,R,U,D,Col,Row;
}p[N*M];
int n,m;
int g[N][M],C[M],cnt=;
bool flag=;
void Delete(int k){
p[p[k].R].L=p[k].L;
p[p[k].L].R=p[k].R;
for (int i=p[k].D;i!=k;i=p[i].D)
for (int j=p[i].R;j!=i;j=p[j].R){
C[p[j].Col]--;
p[p[j].U].D=p[j].D;
p[p[j].D].U=p[j].U;
}
}
void Reset(int k){
p[p[k].L].R=k;
p[p[k].R].L=k;
for (int i=p[k].U;i!=k;i=p[i].U)
for (int j=p[i].L;j!=i;j=p[j].L){
C[p[j].Col]++;
p[p[j].U].D=j;
p[p[j].D].U=j;
}
}
bool DLX(){
if (p[].R==)
return true;
int k=p[].R;
for (int i=p[k].R;i!=;i=p[i].R)
if (C[i]<C[k])
k=i;
Delete(k);
for (int i=p[k].D;i!=k;i=p[i].D){
for (int j=p[i].R;j!=i;j=p[j].R)
Delete(p[j].Col);
if (DLX())
return true;
for (int j=p[i].L;j!=i;j=p[j].L)
Reset(p[j].Col);
}
Reset(k);
return false;
}
int main(){
while (~scanf("%d%d",&n,&m)){
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
scanf("%d",&g[i][j]);
memset(p,,sizeof p);
memset(C,,sizeof C);
for (int i=;i<=m;i++)
p[i].L=i-,p[i].R=i+,p[i].U=p[i].D=i;
p[].L=m,p[m].R=,cnt=m;
for (int i=;i<=n;i++){
int first=cnt+;
for (int j=;j<=m;j++)
if (g[i][j]){
cnt++;
p[cnt].L=cnt-;
p[cnt].R=cnt+;
p[cnt].D=j;
p[p[j].U].D=cnt;
p[cnt].U=p[j].U;
p[j].U=cnt;
C[p[cnt].Col=j]++;
p[cnt].Row=i;
}
if (cnt>=first)
p[first].L=cnt,p[cnt].R=first;
}
if (DLX())
puts("Yes, I found it");
else
puts("It is impossible");
}
return ;
}

POJ3740 Easy Finding 舞蹈链 DLX的更多相关文章

  1. 舞蹈链 DLX

    欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 舞蹈链是一个非常玄学的东西…… 问题模型 精确覆盖问题:在一个01矩阵中,是否可以选出一些行的集合,使得在这些行的集 ...

  2. [学习笔记] 舞蹈链(DLX)入门

    "在一个全集\(X\)中若干子集的集合为\(S\),精确覆盖(\(\boldsymbol{Exact~Cover}\))是指,\(S\)的子集\(S*\),满足\(X\)中的每一个元素在\( ...

  3. luogu P4929 【模板】舞蹈链 DLX

    LINK:舞蹈链 具体复杂度我也不知道 但是 搜索速度极快. 原因大概是因为 每次检索的时间少 有一定的剪枝. 花了2h大概了解了这个东西 吐槽一下题解根本看不懂 只能理解大概的想法 核心的链表不太懂 ...

  4. P4929-[模板]舞蹈链(DLX)

    正题 题目链接:https://www.luogu.com.cn/problem/P4929 题目大意 \(n*m\)的矩形有\(0/1\),要求选出若干行使得每一列有且仅有一个\(1\). 解题思路 ...

  5. Vijos1755 靶形数独 Sudoku NOIP2009 提高组 T4 舞蹈链 DLX

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值 ...

  6. POJ3076 Sudoku 舞蹈链 DLX

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的16*16数独,求解. 题解 DLX + 矩阵构建  (两个传送门) 学完这个之后,再 ...

  7. POJ3074 Sudoku 舞蹈链 DLX

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解. 题解 DLX + 矩阵构建  (两个传送门) 代码 #include & ...

  8. POJ2676 Sudoku 舞蹈链 DLX

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解.SPJ 题解 DLX + 矩阵构建  (两个传送门) 代码 #includ ...

  9. 关于用舞蹈链DLX算法求解数独的解析

    欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 描述 在做DLX算法题中,经常会做到数独类型的题目,那么,如何求解数独类型的题目?其实,学了数独的构建方法,那么DL ...

随机推荐

  1. boolalpha的作用

    #include <iostream>using namespace std;int main(){        bool b=true;        cout << &q ...

  2. 数据结构HashMap(Android SparseArray 和ArrayMap)

    HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...

  3. iOS运行时使用(动态添加方法)

    1 举例  我们实现一个Person类 然后Person 其实是没得对象方法eat:的 下面调用person的eat方法 程序是会奔溃的 那么需要借助运行时动态的添加方法 Person *p = [[ ...

  4. pytorch中的 requires_grad和volatile

    https://blog.csdn.net/u012436149/article/details/66971822 简单总结其用途 (1)requires_grad=Fasle时不需要更新梯度, 适用 ...

  5. spark中RDD的转化操作和行动操作

    本文主要是讲解spark里RDD的基础操作.RDD是spark特有的数据模型,谈到RDD就会提到什么弹性分布式数据集,什么有向无环图,本文暂时不去展开这些高深概念,在阅读本文时候,大家可以就把RDD当 ...

  6. ionic3 点击input 弹出白色遮罩 遮挡上部内容

    在Manifest中的activity里设置android:windowSoftInputMode为adjustPan,默认为adjustResize,当前窗口的内容将自动移动以便当前焦点从不被键盘覆 ...

  7. mysql 修改配置文件my.cnf失败

    一.连接Mysql提示无法通过socket的解决方法连接到本地MySQL服务器 http://www.aiezu.com/db/mysql_cant_connect_through_socket.ht ...

  8. PDF裁剪页面,PDF怎么裁剪页面的方法

    PDF文件要怎么裁剪页面呢,是不是有很多的小伙们想知道呢,当打开一个PDF文件的时候如果一个页面中有很多的空白页面就会影响文件的美观与使用,今天小编就为大家分享一下小编的裁剪页面的方法. 操作软件:迅 ...

  9. 分块入门(根据hzwer的博客。。)(右端点是r不是n。。)

    1.区间更新单点查询 #include <bits/stdc++.h> using namespace std; #define ll long long #define maxn 100 ...

  10. 线性空间和异或空间(线性基)bzoj4004贪心+高斯消元优秀模板

    线性空间:是由一组基底构成的所有可以组成的向量空间 对于一个n*m的矩阵,高斯消元后的i个主元可以构成i维的线性空间,i就是矩阵的秩 并且这i个主元线性无关 /* 每个向量有权值,求最小权极大线性无关 ...