P4929-[模板]舞蹈链(DLX)
正题
题目链接:https://www.luogu.com.cn/problem/P4929
题目大意
\(n*m\)的矩形有\(0/1\),要求选出若干行使得每一列有且仅有一个\(1\)。
解题思路
精确覆盖问题指的是一个集合\(S\)和它的若干个子集集合\(T\),要求选出\(T\)的一个子集使得里面的集合元素刚好覆盖集合\(S\)。
\(DLX\)全称是\(dancing\ link\ X\),其中\(dancing\ link\)是指交叉十字循环双向链,\(X\)是指暴搜。
知道了这些,就可以去看洛谷题解了(
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10100;
int n,m,cnt,l[N],r[N],u[N],d[N],h[N],row[N],col[N],s[N],ans[N];
void init(){
for(int i=0;i<=m;i++)
l[i]=i-1,r[i]=i+1,u[i]=d[i]=i;
l[0]=m;r[m]=0;cnt=m;
}
void link(int x,int y){
col[++cnt]=y;s[y]++;
d[cnt]=y;u[cnt]=u[y];
d[u[y]]=cnt;u[y]=cnt;
row[cnt]=x;
if(!h[x])h[x]=l[cnt]=r[cnt]=cnt;
else{
l[cnt]=l[h[x]];r[cnt]=h[x];
r[l[h[x]]]=cnt;l[h[x]]=cnt;
}
return;
}
void remove(int x){
r[l[x]]=r[x];l[r[x]]=l[x];
for(int i=d[x];i!=x;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]]--;
return;
}
void recover(int x){
for(int i=u[x];i!=x;i=u[i])
for(int j=l[i];j!=i;j=l[j])
u[d[j]]=d[u[j]]=j,s[col[j]]++;
r[l[x]]=l[r[x]]=x;
return;
}
bool dance(int dep){
if(r[0]==0){
for(int i=0;i<dep;i++)
printf("%d ",ans[i]);
return 1;
}
int c=r[0];
for(int i=c;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[dep]=row[i];
for(int j=r[i];j!=i;j=r[j])remove(col[j]);
if(dance(dep+1))return 1;
for(int j=l[i];j!=i;j=l[j])recover(col[j]);
}
recover(c);
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
int x;scanf("%d",&x);
if(x)link(i,j);
}
if(!dance(0))
puts("No Solution!");
return 0;
}
P4929-[模板]舞蹈链(DLX)的更多相关文章
- 舞蹈链 DLX
欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 舞蹈链是一个非常玄学的东西…… 问题模型 精确覆盖问题:在一个01矩阵中,是否可以选出一些行的集合,使得在这些行的集 ...
- luogu P4929 【模板】舞蹈链 DLX
LINK:舞蹈链 具体复杂度我也不知道 但是 搜索速度极快. 原因大概是因为 每次检索的时间少 有一定的剪枝. 花了2h大概了解了这个东西 吐槽一下题解根本看不懂 只能理解大概的想法 核心的链表不太懂 ...
- [学习笔记] 舞蹈链(DLX)入门
"在一个全集\(X\)中若干子集的集合为\(S\),精确覆盖(\(\boldsymbol{Exact~Cover}\))是指,\(S\)的子集\(S*\),满足\(X\)中的每一个元素在\( ...
- POJ3740 Easy Finding 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目 精确覆盖问题模板题 算法 DLX算法 学习DLX算法--传送门 代码 #include <cstring> ...
- Vijos1755 靶形数独 Sudoku NOIP2009 提高组 T4 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值 ...
- POJ3076 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的16*16数独,求解. 题解 DLX + 矩阵构建 (两个传送门) 学完这个之后,再 ...
- POJ3074 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解. 题解 DLX + 矩阵构建 (两个传送门) 代码 #include & ...
- POJ2676 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解.SPJ 题解 DLX + 矩阵构建 (两个传送门) 代码 #includ ...
- 关于用舞蹈链DLX算法求解数独的解析
欢迎访问——该文出处-博客园-zhouzhendong 去博客园看该文章--传送门 描述 在做DLX算法题中,经常会做到数独类型的题目,那么,如何求解数独类型的题目?其实,学了数独的构建方法,那么DL ...
随机推荐
- Linux 分区扩容(根分区扩容,SWAP 分区扩容,挂载新分区为目录)
请访问原文链接:https://sysin.org/blog/linux-partition-expansion/,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin.org,主页: ...
- MVVMLight学习笔记(七)---Messenger使用
一.概述 Messenger中文解释为信使的意思,顾名思义,在MvvmLight中,它的主要作用是用于View和ViewModel.ViewModel和ViewModel之间的通信. 考虑以下场景: ...
- node后台生成echarts图表
1 //2,生成图片数据 2 var option = { 3 tooltip: { 4 trigger: 'item', 5 formatter: "{a} <br/>{b} ...
- ubuntu开机自启设置 Ubuntu16.04下测试OK
在~/.config/autostart/目录下,添加xxx.desktop文件,内容如下: [Desktop Entry] Type=Application Name=start apps NoDi ...
- Qt5完美解决 界面显示中文乱码
最近在学习Qt,可是一直头疼于中文乱码问题,上网搜了一下,很多都是Qt4中使用如下方法: QTextCodec *codec = QTextCodec::codecForName("gbk& ...
- Python语法之函数、引用和装饰器
所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用 函数是带名字的代码块,用于完成具体的工作 需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该 任务 ...
- 我的第一个npm包:wechat-menu-editor 基于Vue的微信自定义菜单编辑器
wechat-menu-editor 微信自定义菜单编辑器 前言 在做微信公众号相关开发时,基本上会去开发的功能就是微信自定义菜单设置的功能,本着不重复造轮子的原则,于是基于Vue封装的一个微信自定义 ...
- 20201219 u,v,w
开考前刚起床,所以一边考一边吃饭,然后整场都很迷... A. u 考场 半天才搞懂"下三角区域"指哪个区域,手模样例确认后打了 \(O(qn^2)\) 的裸暴力,然后就不会做了. ...
- unity渲染篇:烘焙模型贴图
今天要来做一件有趣的事情,那就是把一个模型数据烘焙到贴图上! 什么意思?就是下面酱紫,把这只小喵从第一张图拍扁,变成第二张图的样子(似乎有点残忍~) 可能你经常会从美术那边听到"烘焙光照贴图 ...
- el-table回显遇到的坑
使用element ui 的el-table在做到复选框回显勾中的问题时,整整困惑了我一天,当时百度了一下,好多人都说是 this.$nextTick(() => {})的问提,在组件中监听w ...