您的位置:首页 > 其它

DLX模板

2016-03-04 19:44 387 查看
const int maxnode=100010;
const int maxn=1010;
const int maxm=1010;
struct DLX
{
int L[maxnode],R[maxnode],U[maxnode],D[maxnode],Row[maxnode],Col[maxnode],C[maxm],H[maxn],cnt;
int ans[maxn],ansd;
void Init(int n,int m)
{
for(int i=0;i<=m;i++)
{
L[i]=i-1;R[i]=i+1;
U[i]=D[i]=i;C[i]=0;
}
cnt=m;L[0]=m;R[m]=0;

ansd=0;

for(int i=1;i<=n;i++)
H[i]=0;
}
void Link(int x,int y)
{
C[Col[++cnt]=y]++;
Row[cnt]=x;

U[cnt]=y;
U[D[y]]=cnt;
D[cnt]=D[y];
D[y]=cnt;

if(H[x])
L[R[H[x]]]=cnt,R[cnt]=R[H[x]],R[H[x]]=cnt,L[cnt]=H[x];
else
H[x]=L[cnt]=R[cnt]=cnt;
}

void Delete(int c)
{
L[R[c]]=L[c];R[L[c]]=R[c];
for(int i=D[c];i!=c;i=D[i])
for(int j=R[i];j!=i;j=R[j])
--C[Col[j]],U[D[j]]=U[j],D[U[j]]=D[j];
}

void Resume(int c)
{
L[R[c]]=c;R[L[c]]=c;
for(int i=U[c];i!=c;i=U[i])
for(int j=L[i];j!=i;j=L[j])
++C[Col[j]],U[D[j]]=j,D[U[j]]=j;
}

bool Solve()
{
if(!R[0])return true;
int p=R[0];
for(int i=R[p];i;i=R[i])
if(C[p]>C[i])
p=i;
Delete(p);
ansd++;
for(int i=D[p];i!=p;i=D[i]){
ans[ansd]=Row[i];
for(int j=R[i];j!=i;j=R[j])
Delete(Col[j]);
if(Solve())
return true;

for(int j=L[i];j!=i;j=L[j])
Resume(Col[j]);
}
Resume(p);
--ansd;
return false;
}
}DLX;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: