其他分享
首页 > 其他分享> > DLX 学习笔记

DLX 学习笔记

作者:互联网

用来解决精确覆盖问题

正题

给定一个由 \(0-1\) 组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个 \(1\)

考虑如下矩阵:

1

先假定选择第1行,如下所示:

2

如上图中所示,红色的那行是选中的一行,这一行中有 \(3\) 个 \(1\) ,分别是第\(3\) 、\(5\) 、\(6\) 列。

由于这 \(3\) 列已经包含了 \(1\) ,故,把这三列往下标示,图中的蓝色部分。蓝色部分包含 \(3\) 个\(1\) ,分别在 \(2\) 行中,把这 \(2\) 行用紫色标示出来

根据定义,同一列的 \(1\) 只能有 \(1\) 个,故紫色的两行,和红色的一行的 \(1\) 相冲突。

那么在接下来的求解中,红色的部分、蓝色的部分、紫色的部分都不能用了,把这些部分都删除

得到一个新的矩阵

3

行分别对应矩阵 \(1\) 中的第\(2\)、\(4\)、\(5\)行
列分别对应矩阵 \(1\) 中的第\(1\)、\(2\)、\(4\)、\(7\)列

于是问题就转换为一个规模小点的精确覆盖问题
在新的矩阵中再选择第1行,如下图所示

还是按照之前的步骤,进行标示。红色蓝色紫色的部分又全都删除,导致新的空矩阵产生,而红色的一行中有 \(0\)(有 \(0\) 就说明这一列没有 \(1\) 覆盖)。说明,第 \(1\) 行选择是错误

那么回到之前,选择第 \(2\) 行,如下图所示

按照之前的步骤,进行标示。把红色蓝色紫色部分删除后,得到新的矩阵

行对应矩阵 \(2\) 中的第 \(3\) 行,矩阵 \(1\) 中的第 \(5\) 行
列对应矩阵 \(2\) 中的第 \(2\) 、 \(4\) 列,矩阵 \(1\) 中的第 \(2\) 、 \(7\) 列
由于剩下的矩阵只有 \(1\) 行,且都是 \(1\) ,选择这一行,问题就解决

于是该问题的解就是矩阵 \(1\) 中第 \(1\) 行、矩阵 \(2\) 中的第 \(2\) 行、矩阵 \(3\) 中的第 \(1\) 行。也就是矩阵 \(1\) 中的第 \(1\) 、 \(4\) 、 \(5\) 行

在求解这个问题的过程中,我们第 \(1\) 步选择第 \(1\) 行是正确的,但是不是每个题目第 \(1\) 步选择都是正确的,如果选择第 \(1\) 行无法求解出结果出来,那么就要推倒之前的选择,从选择第 \(2\) 行开始,以此类推


从上面的求解过程来看,实际上求解过程可以如下表示

1、从矩阵中选择一行
2、根据定义,标示矩阵中其他行的元素
3、删除相关行和列的元素,得到新矩阵
4、如果新矩阵是空矩阵,并且之前的一行都是 \(1\),那么求解结束,跳转到6;新矩阵不是空矩阵继续求解,跳转到1;新矩阵是空矩阵,之前的一行中有 \(0\),跳转到5
5、说明之前的选择有误回溯到之前的一个矩阵,跳转到1;如果没有矩阵可以回溯,说明该问题无解,跳转到7
6、求解结束,把结果输出
7、求解结束,输出无解消息

相关题目

Luogu P4929 【模板】舞蹈链(DLX)

原题链接

https://www.luogu.com.cn/problem/P4929

思路

咕咕咕

Luogu P1074 [NOIP2009 提高组] 靶形数独

原题链接

https://www.luogu.com.cn/problem/P1074

思路

咕咕咕

Luogu P4205 [NOI2005] 智慧珠游戏

原题链接

https://www.luogu.com.cn/problem/P4205

思路

咕咕咕

参考内容

https://www.cnblogs.com/grenet/p/3145800.html

标签:选择,求解,矩阵,标示,笔记,学习,一行,跳转,DLX
来源: https://www.cnblogs.com/syqwq/p/16206811.html