题
#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; }