【BZOJ 4443】 [Scoi2015]小凸玩矩阵|二分|最大匹配|匈牙利

来源:互联网 发布:线割编程招聘 编辑:程序博客网 时间:2024/04/24 04:33

没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;}


0 0
原创粉丝点击