//Pro:#41. 【清華集訓2014】矩陣變換 //能夠轉化爲穩定婚姻問題 //確定是要讓每次選擇的數儘可能靠右 //讓行爲男生,列上的數爲女生 //男生的告白次序爲從左到右,女生的好感度最大的男生爲它在的位置最靠右的那一行 //那麼男生告白失敗,就會往右靠,女生選擇好感度最大的也是從最右邊考慮 //這樣匹配下去就能夠了 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> using namespace std; const int N=4e2+5; inline int read() { char c=getchar();int num=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) num=num*10+c-'0'; return num; } int T,n,m; int man[N][N],wom[N][N]; int chman[N],chwom[N]; queue<int> que; inline void solve() { n=read(),m=read(); for(int i=1,a;i<=n;++i) { man[i][0]=0; for(int j=1;j<=m;++j) { a=read(); if(a) { man[i][++man[i][0]]=a; wom[a][i]=j; } } } for(int i=1;i<=n;++i) { que.push(i); chman[i]=1; } int now,to; memset(chwom,0,sizeof(chwom)); while(!que.empty()) { now=que.front(),que.pop(); to=man[now][chman[now]]; if(chwom[to]&&wom[to][chwom[to]]>wom[to][now]) { ++chman[now]; que.push(now); } else { if(chwom[to]) que.push(chwom[to]); chwom[to]=now; } } for(int i=1;i<=n;++i) cout<<man[i][chman[i]]<<' '; puts(""); } int main() { T=read(); while(T--) solve(); return 0; }