您的位置:首页 > 其它

DLX

2016-12-23 15:03 330 查看
// hdu 2828
// poj 3740
int mx
[M];
int U[nm],D[nm],L[nm],R[nm],X[nm],Y[nm];
int S[M],H
;
int sz,ans;
void ver(int x,int y){///上 下
D[x]=y;U[y]=x;
}
void hor(int x,int y){////左 右
R[x]=y;L[y]=x;
}

namespace AA{/////////可重复覆盖
int vis[M];
void Remove(int c){
for(int i = D[c]; i != c; i = D[i])
hor(L[i],R[i]);
}

void Resume(int c){
for(int i = D[c]; i != c; i = D[i])
hor(L[i],i);hor(i,R[i]);
}

int h(){
memset(vis,0,sizeof(vis));
int ans = 0;
for(int c = R[0] ; c ; c = R[c]){
if(!vis[c]){
ans++;
for(int i = D[c]; i != c; i = D[i])
for(int j = R[i]; j != i; j = R[j])
vis[Y[j]] = 1;
}
}
return ans;
}

bool Dance(int dep){
int c=R[0];
if(c == 0)
return 1;
if(dep + h() > ans)       //A_Star剪枝
return 0;

for(int i=R[0]; i; i=R[i])
if(S[i]<S[c]) c=i;

for(i=D[c]; i!=c; i=D[i]){
Remove(i);
for(j=R[i]; j!=i; j=R[j])Remove(j);
if(Dance(dep+1))return 1;
for(j=L[i]; j!=i; j=L[j])Resume(j);//在这里我遵循的原则是先删除的后还原,后删除的先还原。
Resume(i);
}

return 0;
}
}

namespace BB{/////////不可重复覆盖
void Remove(int c){
hor(L[c],R[c]);
for(int i=D[c];i!=c;i=D[i]){
for(int j=R[i];j!=i;j=R[j]){
ver(U[j],D[j]);
S[Y[j]]--;
}
}
}
void Resume(int c){
hor(L[c],c);
hor(c,R[c]);
for(int i=U[c];i!=c;i=U[i]){
for(int j=L[i];j!=i;j=L[j]){
ver(U[j],j);
ver(j,D[j]);
S[Y[j]]++;
}
}
}
int Dance(int k){
int c=R[0];
if(c==0){
return 1;
}
for(int i=R[0];i!=0;i=R[i]){
if(S[i]<S[c])c=i;
}
Remove(c);
for(int i=D[c];i!=c;i=D[i]){
for(int j=R[i];j!=i;j=R[j])Remove(Y[j]);
if(Dance(k+1))return 1;
for(int j=L[i];j!=i;j=L[j])Resume(Y[j]);
}
Resume(c);
return 0;
}
}

void Link(int r,int c){
ver(sz,D[c]);
ver(c,sz);
if(H[r]<0)H[r]=L[sz]=R[sz]=sz;
else {
hor(sz,R[H[r]]);
hor(H[r],sz);
}
S[c]++;
Y[sz]=c;
X[sz++]=r;
}

void Build(int n,int m){
for(int i=0;i<=m;i++){
hor(i,i+1);
D[i]=U[i]=i;
S[i]=0;
}
hor(m,0);
sz=m+1;
for(int i=1;i<=n;i++)H[i]=-1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mx[i][j])Link(i,j);
}
}
}

void solve(int n,int m){
Build(n,m);
if(AA::Dance(0))printf("yes\n");
if(BB::Dance(0))printf("yes\n");
}
int main(){
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: