DLX 舞蹈链 精确覆盖 与 重复覆盖】的更多相关文章

精确覆盖问题:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 还有重复覆盖问题 dancing links 是 一种数据结构,用来优化搜索,不算是一种算法.(双向循环十字链表) 参阅了白书训练指南上的模版,目前只有精确覆盖,等再补上重复覆盖 struct DLX { int n , sz; // 行数,节点总数 int S[maxn]; // 各列节点总数 int row[maxnode],col[maxnode]; // 各节点行列编号 int L[max…
hihoCoder #1317 : 搜索四·跳舞链 原题地址:http://hihocoder.com/problemset/problem/1317 时间限制:10000ms 单点时限:1000ms 内存限制:256MB   描述 小Ho最近遇到一个难题,他需要破解一个棋局. 棋局分成了n行,m列,每行有若干个棋子.小Ho需要从中选择若干行使得每一列有且恰好只有一个棋子. 比如下面这样局面: 其中1表示放置有棋子的格子,0表示没有放置棋子. 对于上面这个问题,小Ho经过多次尝试以后得到了解为选…
DLX的题,做过这题才算是会吧. 这道题转化成了精确覆盖模型来做,一开始,只是单纯的要覆盖完行列和斜线,WA. 后来醒悟了,不能这样,只要覆盖全部行或列即可.虽然如此,但某些细节地方很关键不能考虑到. 特别要注意的是 for(int i=R[c];i;i=R[i]){ if(i>ne) break; if(S[i] < S[c]) c = i;} 找最小值只能是在ne之前,为什么呢?因为我们要完全覆盖行.可行吗?可行.稍微留意一下DLX的模板就知道,它其实在选中一列之后,是会枚举列上的行值,…
题意: 在N个城市选出K个城市,建飞机场(1 ≤ N ≤ 60,1 ≤ K ≤ N),N个城市给出坐标,选择这K个机场,使得从城市到距离自己最近的机场的 最大的距离 最小. 输出这个最小值. 思路: 二分+DLX,DLX判断是否合法,之前看过DLX,但是忘记了,今天看了一个博客,感觉讲解得很清晰,转载过来. DLX: 给定一个n*m的矩阵,有些位置为1,有些位置为0.如果G[i][j]==1则说明i行可以覆盖j列. 1)选定最少的行,使得每列有且仅有一个1. 2)选定最少的行,使得每列至少一个1…
DLX经典题型,被虐惨了…… 建一个2*N行3*N列的矩阵,行代表选择,列代表约束.前2*N列代表每个人的哪种状态,后N列保证每个人至多选一次. 显然对手可以被战胜多次(重复覆盖),每个角色至多选择一次(精确覆盖). 注意事项: 1.行数=∑每个人的模式数,之前我直接把行数当2*N了……但实际上也会有人只有一种模式的,也就是说实际行数小于等于2*N 2.建图的时候注意:这个人不光能覆盖他所战胜的某角色的某模式,还覆盖了他自己的所有模式(因为他不用战胜自己).之前没注意这个问题,样例全成无解了or…
舞蹈链(DLX) Tags:搜索 作业部落 评论地址 一.概述 特别特别感谢这位童鞋His blog 舞蹈链是一种优美的搜索,就像下面这样跳舞- 舞蹈链用于解决精确覆盖或者重复覆盖的问题 你可以想象成贪吃蛇的一个上下左右联通的地图 \(Dancing Links\)就是通过链表这样实现的 网上有图的博客 二.实现 更详细的讲解在课件中 精确覆盖 精确覆盖大概指的就是数独和八皇后那样的问题 矩阵中选择一个行的集合,使得每列有且只有一个1 那么就是说每个格子上的点都有若干限制条件(行.列.对角线),…
就是dancing links 求最小支配集,重复覆盖 精确覆盖时:每次缓存数据的时候,既删除行又删除列(这里的删除列,只是删除表头) 重复覆盖的时候:只删除列,因为可以重复覆盖 然后重复覆盖有一个估价函数,这个函数很强大,可以进行强力剪枝 这个估价函数的意思是,搜索到当前时,至少还需要删除几行,就可以完全覆盖了 这个至少得意思是最优删: 选择一列,假设覆盖这一列的有许多行,假设这些行覆盖的所有列都是一行覆盖的,然后记录数量 然后重复操作,直到全部覆盖,所以这个数量就是最少要的数量 (估价函数很…
题目链接:http://poj.org/problem?id=3074 舞蹈链精确覆盖的经典题目,一个数独每个位置的要求,可以得到以下四个约束1.每个位置有且只有一个数字2.每个位置的数字在一行只能出现一次3.每个位置的数字在一列只能出现一次4.每个位置的数字在一个宫格内只能出现一次然后针对每个位置可以建立舞蹈链了前81列,为1条件的约束82-162列,为2条件的约束163-243列,为3条件的约束244-324列,为4条件的约束则舞蹈链行数为确定的点数+未确定的点数*9,列数为324.如果i行…
精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 例如:如下的矩阵 就包含了这样一个集合(第1.4.5行) 如何利用给定的矩阵求出相应的行的集合呢?我们采用回溯法 矩阵1: 先假定选择第1行,如下所示: 如上图中所示,红色的那行是选中的一行,这一行中有3个1,分别是第3.5.6列. 由于这3列已经包含了1,故,把这三列往下标示,图中的蓝色部分.蓝色部分包含3个1,分别在2行中,把这2行用紫色标示出来 根据定义,同一列的1只能有1个,故紫色的…
转载自:http://www.cnblogs.com/grenet/p/3145800.html 精确覆盖问题的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得集合中每一列都恰好包含一个1 例如:如下的矩阵 就包含了这样一个集合(第1.4.5行) 如何利用给定的矩阵求出相应的行的集合呢?我们采用回溯法 矩阵1: 先假定选择第1行,如下所示: 如上图中所示,红色的那行是选中的一行,这一行中有3个1,分别是第3.5.6列. 由于这3列已经包含了1,故,把这三列往下标示,图中的蓝色部分.…