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 */
View Code

猜你喜欢

转载自www.cnblogs.com/wawawa8/p/9357486.html