样例没过
#include <bits/stdc++.h>
#define int long long
using namespace std;
int read()
{
int res = 0,f = 1;
char ch = getchar();
while (ch<'0'||ch>'9') f = (ch=='-'?-1:1),ch = getchar();
while (ch>='0'&&ch<='9') res = (res<<3)+(res<<1)+(ch^48),ch = getchar();
return res*f;
}
void write(int x)
{
if (x<0) putchar('-'),x = -x;
if (x>9) write(x/10);
putchar(x%10+'0');
}
void writech(int x,char ch){write(x),putchar(ch);}
const int N = 505;
int n,m;
int a[N][N];
int s[N]/*每列节点数*/,h[N]/*每行头结点*/;
int cnt;//1的个数
int l[N],r[N],u[N],d[N],row[N],col[N];
int ans[N];
void init()
{
for (int i = 0; i <= m; i++)
{
row[i]=0;col[i]=i;
u[i]=d[i]=i;
l[i]=i-1;r[i]=i+1;
s[i]=0;
}
l[0]=m;
r[m]=0;
memset(h,-1,sizeof(h));
cnt=m+1;
}
void add(int x,int y)
{
s[y]++;
row[cnt]=x;col[cnt]=y;
u[cnt]=u[y];d[cnt]=y;
u[y]=cnt;
d[u[y]]=cnt;
if (h[x]==-1)
{
h[x]=cnt;
l[cnt]=r[cnt]=cnt;
}
else
{
l[cnt]=l[h[x]];
r[cnt]=h[x];
r[l[h[x]]]=cnt;
l[h[x]]=cnt;
}
cnt++;
}
void shan(int y)
{
l[r[y]]=l[y];
r[l[y]]=r[y];
for (int i = d[y]; i != y; 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]]--;
}
}
}
void hui(int y)
{
for (int i = u[y]; i != y; i = u[i])
{
for (int j = l[i]; j != i; j = l[j])
{
u[d[j]]=j;
d[u[j]]=j;
s[col[j]]++;
}
}
l[r[y]]=r[l[y]]=y;
}
bool dance(int deep)
{
if (r[0]==0)
{
for (int i = 0; i < deep; i++) writech(ans[i],' ');
return true;
}
int c = r[0];
for (int i = r[0]; i != 0; i = r[i]) if (s[i]<s[c]) c=i;
shan(c);
for (int i = d[c]; i != c; i = d[i])
{
ans[deep]=row[i];
for (int j = r[i]; j != i; j = r[j]) shan(col[j]);
if (dance(deep+1)) return true;
for (int j = l[i]; j != i; j = l[j]) hui(col[j]);
}
hui(c);
return false;
}
signed main()
{
n=read(),m=read();
init();
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
a[i][j]=read();
if (a[i][j]==1) add(i,j);
}
}
if (!dance(0)) puts("No Solution!");
return 0;
}