前置知识:
- 一维链表。(单向,双向,循环)
- 部分集合运算,如 ⋂ \bigcap ⋂, ⋃ \bigcup ⋃.
前言
在计算机科学中,X算法可用来求解精确覆盖问题。
精确覆盖问题 是哪一类问题呢? X X X 算法又是什么高深的算法呢?
背景
- 你的同学通过某种算法迅速 AC \text{AC} AC 了 P1784 数独,然后他兴致勃勃地 带领学生 1 s 1s 1s 搞定数独竞赛 。
小时候,你玩数独;长大了,数独玩你。你该怎么办?
- 那位同学用 DLX \text{DLX} DLX 轻松码力全开搞定了 P4205 『NOI2005』智慧珠游戏
小时候,你玩智慧珠;长大了,智慧珠玩你。你该怎么办?
定义
Dancing Links X \text{Dancing Links X} Dancing Links X 是优化后的 X X X 算法,用于解决 精确覆盖问题。
精确覆盖问题 是这样一类问题:给定若干集合 S 1 , S 2 ⋯ S n S_1 , S_2 \cdots S_n S1,S2⋯Sn 和一个集合 X X X,求出 T 1 , T 2 ⋯ T k T1 , T2 \cdots T_k T1,T2⋯Tk 使得满足:
T i ⋂ T j = ∅ ( i ≠ j ) T_i \bigcap T_j = \varnothing (i \not = j) Ti⋂Tj=∅(i=j)
⋃ i = 1 k T i = X \bigcup_{i=1}^k T_i = X i=1⋃kTi=X
∀ i ∈ [ 1 , k ] , T i ∈ S 1 , S 2 ⋯ S n ∀ i \in [1,k] , T_i \in {S_1 , S_2 \cdots S_n} ∀i∈[1,k],Ti∈S1,S2⋯Sn
翻译成人话 其实就是在 n n n 个集合中选出若干 两两不相交 的集合且 这些集合的并为 X X X.
比方说:
S 1 = 666 , 2 , 4 S_1 = {666,2,4} S1=666,2,4
S 2 = 2 , 4 , 8 , 119 S_2={2,4,8,119} S2=2,4,8,119
S 3 = 8 , 5 S_3={8,5} S3=8,5
S 4 = 666 , 2 , 4 , 119 S_4={666,2,4,119} S4=666,2,4,119
S 5 = 666 , 4 , 5 S_5={666,4,5} S5=666,4,5
X = 666 , 2 , 8 , 4 , 5 , 119 X={666,2,8,4,5,119} X=666,2,8,4,5,119
那么这时答案就应该是取