bzoj 4443 [Scoi2015]小凸玩矩阵
题面
https://www.lydsy.com/JudgeOnline/problem.php?id=4443
题解
水题
二分答案 然后跑二分图匹配 如果匹配数量大于等于 那么可行
匈牙利比较好写
Code
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 ll read(){ 6 ll x=0,f=1;char c=getchar(); 7 while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();} 8 while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();} 9 return x*f; 10 } 11 12 int n,m,k; 13 int match[300],vis[300]; 14 int a[300][300]; 15 16 bool dfs(int x,int mn){ 17 for(int i=1;i<=m;i++){ 18 if(!vis[i] && a[x][i]<=mn){ 19 vis[i]=1; 20 if(!match[i] || dfs(match[i],mn)){ 21 match[i]=x; 22 return 1; 23 } 24 } 25 } 26 return 0; 27 } 28 29 int main(){ 30 #ifdef LZT 31 freopen("in","r",stdin); 32 #endif 33 n=read(),m=read(),k=read(); 34 for(int i=1;i<=n;i++) 35 for(int j=1;j<=m;j++) 36 a[i][j]=read(); 37 int l=1,r=1e9; 38 while(l<=r){ 39 int md=(l+r)>>1; 40 int cnt=0; 41 memset(match,0,sizeof(match)); 42 for(int i=1;i<=n;i++){ 43 memset(vis,0,sizeof(vis)); 44 if(dfs(i,md)) cnt++; 45 } 46 if(cnt>=n-k+1) r=md-1; 47 else l=md+1; 48 } 49 printf("%d\n",r+1); 50 return 0; 51 } 52 53 /* 54 3 4 2 55 1 5 6 6 56 8 3 4 3 57 6 8 6 3 58 */