DLX模板

 1 const int maxnode=100010;
 2 const int maxn=1010;
 3 const int maxm=1010;
 4 struct DLX
 5 {
 6     int L[maxnode],R[maxnode],U[maxnode],D[maxnode],Row[maxnode],Col[maxnode],C[maxm],H[maxn],cnt;
 7     int ans[maxn],ansd;
 8     void Init(int n,int m)
 9     {
10         for(int i=0;i<=m;i++)
11         {
12             L[i]=i-1;R[i]=i+1;
13             U[i]=D[i]=i;C[i]=0;
14         }
15         cnt=m;L[0]=m;R[m]=0;
16
17         ansd=0;
18
19         for(int i=1;i<=n;i++)
20             H[i]=0;
21     }
22     void Link(int x,int y)
23     {
24         C[Col[++cnt]=y]++;
25         Row[cnt]=x;
26
27         U[cnt]=y;
28         U[D[y]]=cnt;
29         D[cnt]=D[y];
30         D[y]=cnt;
31
32         if(H[x])
33             L[R[H[x]]]=cnt,R[cnt]=R[H[x]],R[H[x]]=cnt,L[cnt]=H[x];
34         else
35             H[x]=L[cnt]=R[cnt]=cnt;
36     }
37
38     void Delete(int c)
39     {
40         L[R[c]]=L[c];R[L[c]]=R[c];
41         for(int i=D[c];i!=c;i=D[i])
42             for(int j=R[i];j!=i;j=R[j])
43                 --C[Col[j]],U[D[j]]=U[j],D[U[j]]=D[j];
44     }
45
46     void Resume(int c)
47     {
48         L[R[c]]=c;R[L[c]]=c;
49         for(int i=U[c];i!=c;i=U[i])
50             for(int j=L[i];j!=i;j=L[j])
51                 ++C[Col[j]],U[D[j]]=j,D[U[j]]=j;
52     }
53
54     bool Solve()
55     {
56         if(!R[0])return true;
57         int p=R[0];
58         for(int i=R[p];i;i=R[i])
59             if(C[p]>C[i])
60                 p=i;
61         Delete(p);
62         ansd++;
63         for(int i=D[p];i!=p;i=D[i]){
64             ans[ansd]=Row[i];
65             for(int j=R[i];j!=i;j=R[j])
66                 Delete(Col[j]);
67             if(Solve())
68                 return true;
69
70             for(int j=L[i];j!=i;j=L[j])
71                 Resume(Col[j]);
72         }
73         Resume(p);
74         --ansd;
75         return false;
76     }
77 }DLX;
时间: 2024-12-28 10:04:44

DLX模板的相关文章

[ACM] POJ 3740 Easy Finding (DLX模板题)

Easy Finding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16178   Accepted: 4343 Description Given a M×N matrix A. Aij ∈ {0, 1} (0 ≤ i < M, 0 ≤ j < N), could you find some rows that let every cloumn contains and only contains one 1.

最新版dlx模板(精确覆盖+重复覆盖)

以前的代码太挫了,重新整理dlx,学习HH把精确覆盖,重复覆盖整合在一起. 代码: struct DLX{ const static int maxn=20010; #define FF(i,A,s) for(int i = A[s];i != s;i = A[i]) int L[maxn],R[maxn],U[maxn],D[maxn]; int size,col[maxn],row[maxn],s[maxn],H[maxn]; bool vis[70]; int ans[maxn],cnt;

UVALive 2659 数独 DLX模板

建图: 从1到16枚举所有的行.列上放的数. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #include <string> 8 #include <queue> 9 #include <

POJ 3076 数独(DLX算法)

Sudoku Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 4439   Accepted: 2160 Description A Sudoku grid is a 16x16 grid of cells grouped in sixteen 4x4 squares, where some cells are filled with letters from A to P (the first 16 capital l

hihoCoder #1321 : 搜索五?数独 (Dancing Links ,精确覆盖)

hiho一下第102周的题目. 原题地址:http://hihocoder.com/problemset/problem/1321 题意:输入一个9*9数独矩阵,0表示没填的空位,输出这个数独的答案. 提示已经讲解的很清楚了.稍微整理下思路.最后附AC代码. 一.Dancing Links解决精确覆盖问题.      1.精确覆盖问题         给定一个n行,m列的01矩阵.从中选择若干行使得每一列有且恰好只有一个1. 例如: 答案是选择2,3,4行. 2.DancingLinks求解精确

POJ 2676 Sudoku (搜索,Dancing Links)

题目: http://poj.org/problem?id=2676 题意: 数独,每行1-9,每列1-9,每3*3小格1-9,填数,不能重复 方法:Dancing Links(16ms)或者DFS暴搜(400-900ms) Dancing Links(DLX) 是为了解决矩阵精确覆盖问题的算法,算法效率非常高 使用DLX解决的问题必须转化为矩阵精确覆盖问题: 1.DLX详解: http://wenku.baidu.com/view/d8f13dc45fbfc77da269b126.html 2

#2018BIT软件工程基础#个人项目:数独

一.开发时间 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划     · Estimate · 估计这个任务需要多少时间 5 6 Development 开发     · Analysis · 需求分析 (包括学习新技术) 420 840 · Design Spec · 生成设计文档 120 180 · Design Review · 设计复审 (和同事审核设计文档) 10 20 · Coding Sta

精确覆盖DLX算法模板另一种写法

代码 struct DLX { int n,id; int L[maxn],R[maxn],U[maxn],D[maxn]; int C[maxn],S[maxn],loc[maxn][2]; int H[ms]; void init(int nn=0) //传列长 { n=nn; for(int i=0;i<=n;i++) U[i]=D[i]=i,L[i]=i-1,R[i]=i+1; L[0]=n; R[n]=0; id=n; memset(S,0,sizeof(S)); memset(H,-

精确覆盖DLX算法模板

代码 struct DLX { int n,id; int L[maxn],R[maxn],U[maxn],D[maxn]; int C[maxn],S[maxn],loc[maxn][2]; void init(int nn=0) //传列长 { n=nn; for(int i=0;i<=n;i++) U[i]=D[i]=i,L[i]=i-1,R[i]=i+1; L[0]=n; R[n]=0; id=n; memset(S,0,sizeof(S)); } void AddRow(int x,i