#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int a[251][251],n,m,k; vector<int> G[251];
int link[251]; bool vis[251];
bool dfs(int x){
    for(int i=0;i<G[x].size();++i){
        int e=G[x][i]; if(!vis[e]){
            vis[e]=1;
            if(!link[e]||dfs(link[e])){
                link[e]=x; return 1;
            }
        }
    }
    return 0;
}
bool check(int v){
    for(int i=1;i<=n;++i) G[i].clear();
    for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if(a[i][j]<=v) G[i].push_back(j);
    memset(link,0,sizeof link); int ans=0;
    for(int i=1;i<=n;++i){
        memset(vis,0,sizeof vis);
        if(dfs(i)){
            ++ans; if(ans==n-k+1) return 1;
        }
    }
    return 0;
}
int main(){
    int l=0x3f3f3f3f,r=0; scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;++i) for(int j=1;j<=m;++j){
        scanf("%d",&a[i][j]);
        if(a[i][j]<l) l=a[i][j]; if(a[i][j]>r) r=a[i][j];
    }
    for(;l!=r;){
        int mid=(l+r)/2;
        if(check(mid)) r=mid;else l=mid+1;
    }
    printf("%d",l); return 0;
}
2006

 

posted @ 2017-08-13 21:06  Echo宝贝儿  阅读(70)  评论(0编辑  收藏  举报