题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=4443
题解:
二分答案,判断最大匹配是否>=n-k+1;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std; const int maxn=;
const int INF=1e9;
int mat[maxn][maxn]; int n,m,k;
int lef[maxn],_t[maxn];
vector<int> G[maxn]; bool match(int i){
for(int j=;j<G[i].size();j++){
int v=G[i][j];
if(_t[v]==){
_t[v]=;
if(!lef[v]||match(lef[v])){
lef[v]=i;
return true;
}
}
}
return false;
} bool check(int x){
for(int i=;i<=n;i++) G[i].clear();
memset(lef,,sizeof(lef));
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mat[i][j]<=x) G[i].push_back(j);
}
}
for(int i=;i<=n;i++){
memset(_t,,sizeof(_t));
match(i);
}
int cnt=;
for(int i=;i<=m;i++){
if(lef[i]) cnt++;
}
if(cnt>=n-k+) return true;
return false;
} int main(){
while(scanf("%d%d%d",&n,&m,&k)==&&n){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&mat[i][j]);
}
}
int low=,hig=INF;
while(low<hig-){
int mid=low+(hig-low)/;
if(check(mid)) hig=mid;
else low=mid;
}
printf("%d\n",hig);
}
return ;
}