随笔分类 - Dancing Links
摘要:正解2-SAT。我用DLX想搜一搜的,结果TLE了……没什么遗憾,最起码我尝试过了。扔个代码留作纪念。#include #include #include #include #include using namespace std;const int INF = 1 N ) return false; if ( R[head] == head ) { if ( cur == N ) return true; return false; } minv = INF; for ( i = R[head]; i != h...
阅读全文
摘要:DLX经典题型,被虐惨了……建一个2*N行3*N列的矩阵,行代表选择,列代表约束。前2*N列代表每个人的哪种状态,后N列保证每个人至多选一次。显然对手可以被战胜多次(重复覆盖),每个角色至多选择一次(精确覆盖)。注意事项:1.行数=∑每个人的模式数,之前我直接把行数当2*N了……但实际上也会有人只有一种模式的,也就是说实际行数小于等于2*N2.建图的时候注意:这个人不光能覆盖他所战胜的某角色的某模式,还覆盖了他自己的所有模式(因为他不用战胜自己)。之前没注意这个问题,样例全成无解了orz……3.处理精确覆盖和重复覆盖的先后顺序。如果优先处理精确覆盖,会把重复覆盖的一些行也删掉,这样前面可以重复
阅读全文
摘要:以下转自 这里 :最小支配集问题:二分枚举最小距离,判断可行性。可行性即重复覆盖模型,DLX解之。A*的启发函数:对当前矩阵来说,选择一个未被控制的列,很明显该列最少需要1个行来控制,所以ans++。该列被控制后,把它所对应的行,全部设为已经选择,并把这些行对应的列也设为被控制。继续选择未被控制的列,直到没有这样的列。#include #include #include #include #include using namespace std;const double eps = 1e-9;const int INF = 1 K ) return false; int minv = ...
阅读全文
摘要:推荐两篇学DLX的博文:http://bbs.9ria.com/thread-130295-1-1.html(这篇对DLX的工作过程演示的很详细)http://yzmduncan.iteye.com/blog/1151695(这篇对精确覆盖与重复覆盖解释的简洁清晰,模板来自这篇博文)以下转载:DLX解决9*9的数独问题,转化为729*324的精确覆盖问题行:一共9*9*9==729行。一共9*9小格,每一格有9种可能性(1-9),每一种可能都对应着一行。列:一共(9+9+9)*9+81==324种前面三个9分别代表着9行9列和9小块,乘以9的意思是9种可能(1-9),因为每种可能只可以选择一个
阅读全文