多做题,学建图ING
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#define MAX 200
using namespace std;
int g[MAX][MAX];
int link[MAX],vis[MAX],map[MAX][MAX],mark[MAX],cnt[MAX];
int n,m,k;
int dfs(int u)
{
int i;
for(i=1; i<=n; i++)
{
if( g[u][i] && !vis[i] )
{
vis[i] = 1;
if(link[i] == -1 || dfs(link[i]))
{
link[i] = u;
return 1;
}
}
}
return 0;
}
int match()
{
int i, ans = 0;
for(i=1; i<=n; i++)
{
memset(vis,0,sizeof(vis));
ans += dfs(i);
}
//cout << ans << endl;
return ans;
}
void init()
{
memset(link,-1,sizeof(link));
memset(g,0,sizeof(g));
}
int main()
{
int i,j,l,ans;
while( scanf("%d%d",&n,&k) )
{
if(n == 0 && k == 0)
break;
memset(mark,0,sizeof(mark));
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
scanf("%d",&map[i][j]);
mark[map[i][j]] = 1;
}
}
for(l=1; l<=50; l++)
{
if(mark[l])
{
init();
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
if(map[i][j] == l)
g[i][j] = 1;
}
ans = match();
if(ans <= k)
mark[l] = 0;
}
}
int count = 0;
for(i=1; i<=50; i++)
{
if(mark[i])
cnt[count++] = i;
}
if(count == 0)
cout << -1 << endl;
else
{
for(i=0; i<count-1; i++)
{
cout << cnt[i] << ' ';
}
cout << cnt[count-1] << endl;
}
}
return 0;
}