没YY出来
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 251;
int num[MAXN][MAXN];
int n,m,k,T,cnt;
int b[MAXN],go[MAXN][MAXN],flag[MAXN];
struct H
{
int x,y;
int num;
}a[MAXN*MAXN];
bool cmp(H a, H b){return a.num<b.num;}
bool dfs(int x)
{
if(b[x]==T) return false;
b[x]=T;
for(int i=1;i<=go[x][0];i++)
{
int tmp=go[x][i];
if(!flag[tmp]||dfs(flag[tmp]))
{
flag[tmp]=x;
return true;
}
}
return false;
}
bool ok()
{
memset(flag,0,sizeof(flag));
int ans=0;
for(int i=1;i<=n;i++)
{
T++;
if(dfs(i))
{
ans++;
if(ans==k)return true;
}
}
return false;
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
k=n+1-k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[++cnt].num),
a[cnt].x=i,
a[cnt].y=j;
sort(a+1,a+cnt+1,cmp);
int last=0;
int L=1,R=cnt;
while(L!=R)
{
int mid=(L+R)/2;
while(last<mid) {last++;go[a[last].x][++go[a[last].x][0]]=a[last].y;}
while(last>mid) {go[a[last].x][0]--;last--;}
if(ok()) R=mid;
else L=mid+1;
}
printf("%d",a[L].num);
return 0;
}