DLX10分求助
查看原帖
DLX10分求助
654947
VCOI楼主2023/8/29 16:47
#include<bits/stdc++.h>
using namespace std;
struct DLX{
    int n,m,cnt,a[1001][1001],pos[6001][2],x[6001],y[6001],head[6001],l[6001],r[6001],u[6001],d[6001],s[6001],ans[1001];
    void init(){
        cin>>n>>m;
        for(int i=1;i<=m;++i)
            l[i]=i-1,r[i]=i+1,u[i]=d[i]=i;
        l[0]=m,r[m]=0;
        cnt=m+1;
        memset(head,-1,sizeof(head));
        memset(s,0,sizeof(s));
    }
    void add(int v,int c){
        x[++cnt]=c;y[cnt]=v;++s[cnt];
        u[cnt]=c;d[cnt]=d[c];u[d[c]]=cnt;d[c]=cnt;
        if(head[v]<0)
            head[v]=l[cnt]=r[cnt]=cnt;else{
                r[cnt]=r[head[v]];l[cnt]=head[v];
                r[head[v]]=cnt;l[r[head[v]]]=cnt;
            }
    }
    void del(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])
                u[d[j]]=u[j],d[u[j]]=d[j],--s[x[j]];
    }
    void redel(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]]=d[u[j]]=j,++s[x[j]];
        l[r[c]]=r[l[c]]=c;
    }
    void print(){
        if(ans[0])
            for(int i=1;i<=ans[0];++i)
                cout<<ans[i]<<' ';else
                cout<<"No Solution!";
    }
    bool dfs(int c){
        if(!r[0]){
            print();
            return 1;
        }
        int cc=r[0];
        for(int i=r[0];i;i=r[i]) 
            if(s[i]<s[c]) c=i;
        del(cc);
        for(int i=d[cc];i!=cc;i=d[i]){
            ans[c]=y[i];
            for(int j=r[i];j!=i;j=r[j]) del(x[j]);
            if(dfs(c+1)) return 1;
            for(int j=l[i];j!=i;j=l[j]) redel(x[j]);
        }
        redel(cc);
        return 0;
    }
    void input(){
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j){
                cin>>a[i][j];
                if(a[i][j])
                    add(i,j);
            }

    }
}dlx;
int main(){
    dlx.init();
    dlx.input();
    dlx.dfs(1);
    return 0;
}

求助,全输出了No Solution!

2023/8/29 16:47
加载中...