舞蹈链 模板
作者:互联网
精确覆盖
#include<bits/stdc++.h>
using namespace std;
const int N = 260000;
inline int in(){
int x=0;char c=0;
while(c<'0'||c>'9') c=getchar();
while(c<='9'&&c>='0') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
int n,m,cnt;
int l[N],r[N],u[N],d[N],col[N],row[N],h[N],s[N];
int ansk[N];
void init(int m){//m个元素
for(int i = 0; i <= m; i++){
r[i]=i+1,l[i]=i-1;
u[i]=d[i]=i;
}
r[m]=0;l[0]=m;
memset(h,-1,sizeof(h));
memset(s,0,sizeof(s));
cnt=m+1;
}
void link(int R,int C){
s[C]++;
row[cnt]=R;col[cnt]=C;
u[cnt]=C;d[cnt]=d[C];
u[d[C]]=cnt;d[C]=cnt;
if(h[R]==-1) h[R]=l[cnt]=r[cnt]=cnt;
else{
r[cnt]=h[R];l[cnt]=l[h[R]];
r[l[h[R]]]=cnt;l[h[R]]=cnt;
}
cnt++;
return;
}
inline 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]){
u[d[j]]=u[j];
d[u[j]]=d[j];
s[col[j]]--;
}
}
}
inline void resume(int C){
for(int i=u[C]; i!=C; i=u[i]){
for(int j=l[i]; j!=i; j=l[j]){
u[d[j]]=j;d[u[j]]=j;
s[col[j]]++;
}
}
r[l[C]]=C;
l[r[C]]=C;
}
bool dance(int deep){
if(r[0]==0){
register int i=0;
for(i=0;i<deep;i++)printf("%d ",ansk[i]);
return 1;
}
int c=r[0];
int i,j;
for(i=r[0];i!=0;i=r[i]) if(s[i]<s[c])c=i;
remove(c);
for(i=d[c];i!=c;i=d[i]){
ansk[deep]=row[i];
for(j=r[i];j!=i;j=r[j]) remove(col[j]);
if(dance(deep+1))return 1;
for(j=l[i];j!=i;j=l[j]) resume(col[j]);
}
resume(c);
return 0;
}
int main(){
// freopen("cin.txt","r",stdin);
n=in(),m=in();
register int i,j;
int f;
init(m);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
f=in();
if(f)link(i,j);
}
}
if(!dance(0))printf("No Solution!");
return 0;
}
标签:std,char,const,260000,int,舞蹈,while,模板 来源: https://blog.csdn.net/weixin_43824564/article/details/107008744