Dancing links 模板
知识点传送门
代码模版一
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<map>
#include<string>
#include<cstdio>
#include<cmath>
#include<stack>
void fre() { freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); } void Fre() { freopen("A.txt", "r", stdin);}
#define ios ios::sync_with_stdio(false)
#define Pi acos(-1)
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
#define db double
#define Pir pair<int, int>
#define PIR pair<Pir, Pir>
#define m_p make_pair
#define INF 0x3f3f3f3f
#define mod (ll)(1e9 + 7)
#define for_(i, s, e) for(int i = (ll)(s); i <= (ll)(e); i ++)
#define rep_(i, e, s) for(int i = (ll)(e); i >= (ll)(s); i --)
#define sd(a) scanf("%d", &a)
#define sc(a) scanf("%c", &a)
using namespace std;
const int mxnode = 450010;
const int mxm = 1e3 + 10;
const int mxn = 510;
struct DLX
{
int n, m, size;
int U[mxnode], D[mxnode], L[mxnode], R[mxnode], Row[mxnode], Col[mxnode];
int H[mxn];
int S[mxm];
int ansd, ans[mxn];
void init(int _n, int _m)
{
n = _n, m = _m;
for_(i, 0, m)
{
S[i] = 0;
U[i] = D[i] = i;
L[i] = i - 1;
R[i] = i + 1;
}
R[m] = 0, L[0] = m;
for_(i, 1, n)
H[i] = -1;
size = m;
}
void link(int r, int c)
{
Row[++ size] = r;
Col[size] = c;
S[c] ++;
D[size] = c;
U[size] = U[c];
D[U[c]] = size;
U[c] = size;
if(H[r] == -1)
H[r] = L[size] = R[size] = size;
else
{
L[size] = size - 1;
R[size] = H[r];
R[L[size]] = size;
L[H[r]] = size;
}
}
void remove(int c)
{
R[L[c]] = R[c];
L[R[c]] = L[c];
for(int i = D[c]; i != c; i = D[i])
for(int j = R[i]; j != i; j = R[j])
D[U[j]] = D[j], U[D[j]] = U[j], S[Col[j]] --;
}
void resume(int c)
{
R[L[c]] = c;
L[R[c]] = c;
for(int i = D[c]; i != c; i = D[i])
for(int j = R[i]; j != i; j = R[j])
D[U[j]] = U[D[j]] = j, S[Col[j]] ++;
}
void dance(int d)
{
if(ansd != -1 && ansd <= d) return;
if(R[0] == 0)
{
if(ansd == -1) ansd = d;
else if(ansd > d) ansd = d;
return;
}
int c = R[0];
for(int i = R[0]; i; i = R[i])
if(S[c] > S[i])
c = i;
remove(c);
for(int i = D[c]; i != c; i = D[i])
{
ans[d] = Row[i];
for(int j = R[i]; j != i; j = R[j])
remove(Col[j]);
dance(d + 1);
for(int j = L[i]; j != i; j = L[j])
resume(Col[j]);
}
resume(c);
}
} dl;
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<map>
#include<string>
#include<cstdio>
#include<cmath>
#include<stack>
void fre() { freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); } void Fre() { freopen("A.txt", "r", stdin);}
#define ios ios::sync_with_stdio(false)
#define Pi acos(-1)
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
#define db double
#define Pir pair<int, int>
#define PIR pair<Pir, Pir>
#define m_p make_pair
#define INF 0x3f3f3f3f
#define mod (ll)(1e9 + 7)
#define for_(i, s, e) for(int i = (ll)(s); i <= (ll)(e); i ++)
#define rep_(i, e, s) for(int i = (ll)(e); i >= (ll)(s); i --)
#define sd(a) scanf("%d", &a)
#define sc(a) scanf("%c", &a)
using namespace std;
struct DLX
{
struct node
{
int c, left, right, up, down;
};
vector<node> a;
using vec = vector<int>;
using maz = vector<vec>;
vec cnt;
void build(const maz & b, int m)
{
a.clear();
cnt = vec(m + 1);
for_(i, 0, m)
a.pb({ i, (i + m) % (m + 1), (i + 1) % (m + 1), i, i });
for(auto & i : b)
{
for(auto & j : i)
{
node cur = { j, -1, -1, a[j].up, j };
a[cur.up].down = a.size();
a[cur.down].up = a.size();
if(j == i.front())
cur.left = cur.right = a.size();
else
{
cur.left = a.size() - 1;
cur.right = a.back().right;
a[cur.left].right = a.size();
a[cur.right].left = a.size();
}
a.pb(cur);
cnt[j] ++;
}
}
}
void cover(int col)
{
a[a[col].left].right = a[col].right;
a[a[col].right].left = a[col].left;
for(int i = a[col].down; i != col; i = a[i].down)
for(int j = a[i].right; j != i; j = a[j].right)
{
a[a[j].up].down = a[j].down;
a[a[j].down].up = a[j].up;
cnt[a[j].c] --;
}
}
void uncover(int col)
{
a[a[col].left].right = col;
a[a[col].right].left = col;
for(int i = a[col].down; i != col; i = a[i].down)
for(int j = a[i].right; j != i; j = a[j].right)
{
a[a[j].up].down = j;
a[a[j].down].up = j;
cnt[a[j].c] ++;
}
}
void dance(int & res, int lev)
{
if(lev >= res) return;
int c = -1, mn_cnt = INF;
for(int i = a[0].right; i; i = a[i].right)
{
if(cnt[i] < mn_cnt)
{
mn_cnt = cnt[i];
c = i;
}
}
if(c == -1)
{
res = lev;
return;
}
cover(c);
for(int i = a[c].down; i != c; i = a[i].down)
{
for(int j = a[i].right; j != i; j = a[j].right)
cover(a[j].c);
dance(res, lev + 1);
for(int j = a[i].left; j != i; j = a[j].left)
uncover(a[j].c);
}
uncover(c);
return;
}
};
int main()
{
return 0;
}