#舞蹈链(DLX) Tags:搜索 ##作业部落 ##评论地址
##一、概述 特别特别感谢这位童鞋His blog 舞蹈链是一种优美的搜索,就像下面这样跳舞~
舞蹈链用于解决精确覆盖或者重复覆盖的问题 你可以想象成贪吃蛇的一个上下左右联通的地图 $Dancing Links$就是通过链表这样实现的 网上有图的博客
##二、实现 ####更详细的讲解在课件中 ###精确覆盖 精确覆盖大概指的就是数独和八皇后那样的问题 矩阵中选择一个行的集合,使得每列有且只有一个1 那么就是说每个格子上的点都有若干限制条件(行、列、对角线),每个条件都只允许一个元素 在舞蹈链中(可以把它看作一个表格),每个元素看作一行,限制条件转化为列,选一行删去也同时要删去这一行中所有点所在的列 然后舞蹈链兹瓷快速删除这些东西和快速回溯(复杂度未知) 大概有$init$、$link$、$remove$、$resume$、$dance$五个函数 实现的话看代码吧,有详细的注释 ###Code - [luogu1219]八皇后
#include
#include
#include
#include
using namespace std;
const int N=100100;
int ans,nn,o;
struct out{int a[14];}Ans[N];
namespace DLX
{
int n,m,cnt;//长宽,点的数量
int l[N],r[N],u[N],d[N];//上下左右的情况
int row[N],col[N];//每个点所处的行列
int h[N],s[N];//头节点和每列节点数
int ansk[20];//答案
void init(int nn,int mm)
{
//这个表格被循环套了起来,就像贪吃蛇的地图,左右和上下相通
//预先给第0行的每一列弄一个点
n=nn,m=mm;
for(int i=0;i<=m;i++)
r[i]=i+1,l[i]=i