rt,本地测过了,洛谷测没过。
#include<bits/stdc++.h>
using namespace std;
namespace my_IO{
#define ll long long
#define ull unsigned long long
#define ld long double
#define spc putchar(' ')
#define et putchar('\n')
template<class T>
void read(T &num){
T x=0,f=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)){
x=(x<<3)+(x<<1)+c-48;
c=getchar();
}
num=f*x;
}
template<class T>
void write(T x){
static char buf[40];
static int len=-1;
if(x<0) putchar('-'),x=-x;
do{
buf[++len]=x%10+48;
x/=10;
}while(x);
while(len>=0) putchar(buf[len--]);
}
}
using namespace my_IO;
const int maxn=5510;
int n,m,siz[maxn],U[maxn],D[maxn],L[maxn],R[maxn],cnt,fst[maxn],row[maxn],col[maxn],ans[maxn],ansd;
void init(){
for(int i=0;i<=m;++i){
L[i]=i-1,R[i]=i+1;
U[i]=D[i]=i;
++siz[i];
}
L[0]=m,R[m]=0;
cnt=m;
}
inline void add(int r,int c){
D[++cnt]=D[c],U[cnt]=c,U[D[c]]=cnt,D[c]=cnt;
col[cnt]=c,row[cnt]=r,++siz[c];
if(!fst[r]) fst[r]=R[cnt]=L[cnt]=cnt;
else{
R[cnt]=R[fst[r]],L[cnt]=fst[r];
L[R[fst[r]]]=cnt,R[fst[r]]=cnt;
}
}
void remove(int c){
R[L[c]]=R[c],L[R[c]]=L[c];
for(int u=D[c];u!=c;u=D[u]){
for(int v=R[u];v!=u;v=R[v]){
--siz[col[v]];
D[U[v]]=D[v],U[D[v]]=U[v];
}
}
}
void recover(int c){
R[L[c]]=L[R[c]]=c;
for(int u=D[c];u!=c;u=D[u]){
for(int v=R[u];v!=u;v=R[v]){
++siz[col[v]];
D[U[v]]=U[D[v]]=v;
}
}
}
bool dance(int dep){
if(R[0]==0){
ansd=dep-1;
return 1;
}
int c=R[0];
for(int u=R[0];u!=0;u=R[u]) if(siz[u]<siz[c]) c=u;
remove(c);
for(int u=D[c];u!=c;u=D[u]){
ans[dep]=row[u];
for(int v=R[u];v!=u;v=R[v]) remove(col[v]);
if(dance(dep+1)) return 1;
for(int v=R[u];v!=u;v=R[v]) recover(col[v]);
}
recover(c);
return false;
}
void solve(){
read(n),read(m);
init();
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int x;
read(x);
if(x) add(i,j);
}
}
if(dance(1)) for(int i=1;i<=ansd;++i) write(ans[i]),spc;
else puts("No Solution!");
}
int main(){
int t=1;
while(t--) solve();
}