#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 110
int edge[N][N];
int color[N/2];
bool flag[N/2];
bool vis[N];
int linker[N];
int n;
bool dfs(int u,int x){
for(int i=0;i<n;i++){
if(!vis[i]&&edge[u][i]==x){
vis[i]=1;
if(linker[i]==-1||dfs(linker[i],x)){
linker[i]=u;
return true;
}
}
}
return false;
}
int hungary(int x){
memset(linker,-1,sizeof(linker));
int cnt=0;
for(int i=0;i<n;i++){
memset(vis,0,sizeof(vis));
if(dfs(i,x)) cnt++;
}
return cnt;
}
int main(){
int k;
while(scanf("%d%d",&n,&k)!=EOF){
if(!n&&!k) break;
int cnt=0;
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&edge[i][j]);
if(!flag[edge[i][j]]){
color[cnt++]=edge[i][j];
flag[edge[i][j]]=1;
}
}
}
bool f=0;
sort(color,color+cnt);
for(int i=0;i<cnt;i++){
int temp=hungary(color[i]);
if(temp>k) {
if(!f) printf("%d",color[i]);
else printf(" %d",color[i]);
f=1;
}
}
if(!f) printf("-1");
printf("\n");
}
return 0;
}
//
题意就是判断是否能在k次操作后将同一颜色的气球全部打破,规则是每次只能对一行或一列操作。
因为要打破某一行或某一列的一个气球,则这一整行或一列就会都被打破,而题意是求能否在k次操作下完成任务
则题目就转化成了,求最小定点覆盖的问题,即最少要打破多少个必要的气球才能使所有同色气球都被打破,也就是说打破了这些气球则其他就都会被打破,而最小定点覆盖=二分图最大匹配,题目就成了求二分图匹配的问题了。。
这题与hdu 1281类似都是讲纵向和横向分别当做一个集合。
然后就是对题目的处理的问题了,每次只针对一个颜色。