#include<cstdio>
#include<vector>
using namespace std;
int n,m,arr_t,ans_t=0;
int la[502],la1[502],ans[502],hx[5502],hy[5502],cnt[502]={};
bool del[5502]={};
typedef pair<int,int> P;
struct aaa
{
int L,R,U,D;
}arr[5502];
inline void print()
{
for(int i=1;i<=ans_t;++i)printf("%d%c",ans[i],i==ans_t? '\n':' ');
printf("cnt:");for(int i=1;i<=m;++i)printf("%d%c",cnt[i],i==m? '\n':' ');
for(int i=0;i<=arr_t;++i)printf("%d:%d %d %d %d\n",i,arr[i].L,arr[i].R,arr[i].U,arr[i].D);
puts("");
}
inline bool DLX()
{
//puts("fir:");
//puts("ans:");for(int i=1;i<=ans_t;++i)printf("%d%c",ans[i],i==ans_t? '\n':' ');
//print();
if(!(~arr[0].R))return 1;
int t=arr[0].R,u,v;
vector<int> vec;
vector<P> vec1;
//printf("%d->",t);
for(int i=arr[t].R;~i;i=arr[i].R)
{
//if(i>m)while(1);
if(cnt[i]>cnt[t])
t=i;
}
//printf("%d\n",t);
//if(arr[t].L!=0)while(1);
del[t]=1,arr[arr[t].L].R=arr[t].R;
if(~arr[t].R)arr[arr[t].R].L=arr[t].L;
for(int i=arr[t].D;~i;i=arr[i].D)
{
for(int j=arr[i].L;~j;j=arr[j].L)
if(!del[j])
{
del[j]=1,--cnt[hy[j]],vec.push_back(j),arr[arr[j].U].D=arr[j].D;
if(~arr[j].D)arr[arr[j].D].U=arr[j].U;
}
for(int j=arr[i].R;~j;j=arr[j].R)
if(!del[j])
{
del[j]=1,--cnt[hy[j]],vec.push_back(j),arr[arr[j].U].D=arr[j].D;
if(~arr[j].D)arr[arr[j].D].U=arr[j].U;
}
}
//printf("cnt:");for(int i=1;i<=m;++i)printf("%d%c",cnt[i],i==m? '\n':' ');
//puts("sec:");
//print();
//puts("--------------------------------");
for(int i=arr[t].D;~i;i=arr[i].D)
{
vec1.clear(),ans[++ans_t]=hx[i];
for(int j=arr[i].L,k;~j;j=arr[j].L)
{
//printf("j:%d\n",j);
for(k=arr[j].D;~k;k=arr[k].D)
{
//printf("k:%d\n",k);
for(int l=arr[k].L;~l;l=arr[l].L)
if(!del[l])
{
//printf("l:%d\n",l);
del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
}
for(int l=arr[k].R;~l;l=arr[l].R)
if(!del[l])
{
//printf(" l:%d\n",l);
del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
}
}
for(k=arr[j].U;~arr[k].U;k=arr[k].U)
{
for(int l=arr[k].L;~l;l=arr[l].L)
if(!del[l])
{
del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
}
for(int l=arr[k].R;~l;l=arr[l].R)
if(!del[l])
{
del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
}
}
//printf("vs:%d k:%d\n",vec1.size(),k);
if(!del[k])
{
del[k]=1,vec1.push_back(P(k,1)),arr[arr[k].L].R=arr[k].R;
if(~arr[k].R)arr[arr[k].R].L=arr[k].L;
}
}
for(int j=i,k;~j;j=arr[j].R)
{
//printf("j:%d\n",j);
for(k=arr[j].D;~k;k=arr[k].D)
{
//printf("k:%d\n",k);
for(int l=arr[k].L;~l;l=arr[l].L)
if(!del[l])
{
//printf("l:%d\n",l);
del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
}
for(int l=arr[k].R;~l;l=arr[l].R)
if(!del[l])
{
//printf(" l:%d\n",l);
del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
}
}
for(k=arr[j].U;~arr[k].U;k=arr[k].U)
{
for(int l=arr[k].L;~l;l=arr[l].L)
if(!del[l])
{
del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
}
for(int l=arr[k].R;~l;l=arr[l].R)
if(!del[l])
{
del[l]=1,vec1.push_back(P(l,0)),--cnt[hy[l]],arr[arr[l].U].D=arr[l].D;
if(~arr[l].D)arr[arr[l].D].U=arr[l].U;
}
}
//printf("vs:%d k:%d\n",vec1.size(),k);
if(!del[k])
{
del[k]=1,vec1.push_back(P(k,1)),arr[arr[k].L].R=arr[k].R;
if(~arr[k].R)arr[arr[k].R].L=arr[k].L;
}
}
if(DLX())return 1;
--ans_t;
for(int j=vec1.size()-1;~j;--j)
{
del[vec1[j].first]=0;
if(vec1[j].second)
{
arr[arr[vec1[j].first].L].R=vec1[j].first;
if(~arr[vec1[j].first].R)arr[arr[vec1[j].first].R].L=vec1[j].first;
}
else
{
++cnt[hy[vec1[j].first]],arr[arr[vec1[j].first].U].D=vec1[j].first;
if(~arr[vec1[j].first].D)arr[arr[vec1[j].first].D].U=vec1[j].first;
}
}
}
for(int i=vec.size()-1;~i;--i)
{
del[vec[i]]=0,++cnt[hy[vec[i]]],arr[arr[vec[i]].U].D=vec[i];
if(~arr[vec[i]].D)arr[arr[vec[i]].D].U=vec[i];
}
//if(arr[t].L!=0)while(1);
del[t]=0,arr[arr[t].L].R=t;
if(~arr[t].R)arr[arr[t].R].L=t;
//puts("third:");
//print();
//puts("return 0");
return 0;
}
int main()
{
//freopen("1.txt","r",stdin);
scanf("%d%d",&n,&m),arr_t=m;
for(int i=0;i<=m;++i)arr[i]=(aaa){i-1,i<m? i+1:-1,-1,-1},la[i]=i;
for(int i=1;i<=n;++i)la1[i]=-1;
for(int i=1,x;i<=n;++i)
for(int j=1;j<=m;++j)
{
scanf("%d",&x);
if(x)
{
arr[++arr_t]=(aaa){la1[i],-1,la[j],-1},hx[arr_t]=i,hy[arr_t]=j,++cnt[j];
if(~la1[i])arr[la1[i]].R=arr_t;arr[la[j]].D=arr_t,la1[i]=la[j]=arr_t;
}
}
//print();
if(DLX())for(int i=1;i<=ans_t;++i)printf("%d%c",ans[i],i==ans_t? '\n':' ');
else puts("No Solution!");
return 0;
}
/*
6 7
0 0 1 0 1 1 0
1 0 0 1 0 0 1
0 1 1 0 0 1 0
1 0 0 1 0 0 0
0 1 0 0 0 0 1
0 0 0 1 1 0 1
5 7
1 1 1 0 0 0 0
0 0 1 1 1 0 1
0 0 0 1 1 1 1
1 0 0 0 1 1 1
0 0 0 1 1 0 0
*/
这是原代码,启发式优化在第 29~34 行,不知哪里有问题,求大佬帮忙看下,谢谢~
(或者给一组小一点的 Hack 数据也行