[Scoi2015]小凸玩矩阵

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1564  Solved: 734
[Submit][Status][Discuss]

Description

小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最小值是多少。

Input

第一行给出三个整数N,M,K
接下来N行,每行M个数字,用来描述这个矩阵

Output

如题 

Sample Input

3 4 2
1 5 6 6
8 3 4 3
6 8 6 3

Sample Output

3

HINT

1<=K<=N<=M<=250,1<=矩阵元素<=10^9

判断是否能取出N-K+1个小于等于ans的数
但是能取出N-K+1个小于等于ans的数,不代表能取出K个大于等于ans的数呀
注意,最后得到的ans是最小的存在N-K个比它小的数的数

如果连最小的ans都取不到,那么更大的ans也取不到呀

判断的话若(i,j)小于等于x,则第i行向第j列连边,然后跑最大流看是否大于等于n-k+1即可

  1 #include<iostream>
  2 #include<cstdlib>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<ctime>
  7 #include<algorithm>
  8 #include<iomanip>
  9 #include<vector>
 10 #include<stack>
 11 #include<queue>
 12 #include<map>
 13 #include<set>
 14 #include<bitset>
 15 using namespace std;
 16 #define MAXN 1010
 17 #define MAXM 150010
 18 #define ll long long
 19 #define INF 1000000000
 20 #define MOD 1000000007
 21 #define eps 1e-8
 22 struct vec{
 23     int to;
 24     int fro;
 25     int v;
 26 };
 27 vec mp[MAXM];
 28 int tai[MAXN],cnt=1;
 29 int q[MAXM],hd,tl;
 30 int s,t;
 31 int cur[MAXN];
 32 int d[MAXN];
 33 int ans;
 34 inline void be(int x,int y,int z){
 35     mp[++cnt].to=y;
 36     mp[cnt].fro=tai[x];
 37     tai[x]=cnt;
 38     mp[cnt].v=z;
 39 }
 40 inline void bse(int x,int y,int z){
 41     be(x,y,z);
 42     be(y,x,0);
 43 }
 44 bool bfs(){
 45     int i,x,y;
 46     hd=tl=0;
 47     q[tl++]=s;
 48     memset(d,0,sizeof(d));
 49     d[s]=1;
 50     while(hd!=tl){
 51         x=q[hd++];
 52         for(i=tai[x];i;i=mp[i].fro){
 53             y=mp[i].to;
 54             if(!d[y]&&mp[i].v){
 55                 d[y]=d[x]+1;
 56                 q[tl++]=y;
 57             }
 58         }
 59     }
 60     return d[t];
 61 }
 62 int dfs(int x,int mx){
 63     if(x==t){
 64         return mx;
 65     }
 66     int y;
 67     ll re=0,tmp;
 68     for(int &i=cur[x];i;i=mp[i].fro){
 69         y=mp[i].to;
 70         if(d[y]==d[x]+1&&mp[i].v){
 71             tmp=dfs(y,min(mx,mp[i].v));
 72             re+=tmp;
 73             mx-=tmp;
 74             mp[i].v-=tmp;
 75             mp[i^1].v+=tmp;
 76             if(!mx){
 77                 return re;
 78             }
 79         }
 80     }
 81     if(!re){
 82         d[x]=0;
 83     }
 84     return re;
 85 }
 86 int n,m,a[260][260],k;
 87 bool OK(int x){
 88     int i,j;
 89     s=n+m+1;
 90     t=s+1;
 91     memset(tai,0,sizeof(tai));
 92     cnt=1;
 93     for(i=1;i<=n;i++){
 94         for(j=1;j<=m;j++){
 95             if(a[i][j]<=x){
 96                 bse(i,n+j,1);
 97             }
 98         }
 99     }
100     for(i=1;i<=n;i++){
101         bse(s,i,1);
102     }
103     for(i=1;i<=m;i++){
104         bse(n+i,t,1);
105     }
106     int flow=0;
107     while(bfs()){
108         for(i=1;i<=t;i++){
109             cur[i]=tai[i];
110         }
111         flow+=dfs(s,INF);
112     }
113     return flow>=n-k+1;
114 }
115 int main(){
116     int i,j;
117     scanf("%d%d%d",&n,&m,&k);
118     for(i=1;i<=n;i++){
119         for(j=1;j<=m;j++){
120             scanf("%d",&a[i][j]);
121         }
122     }
123     int l=0,r=INF;
124     int ans;
125     while(l<=r){
126         int mid=l+r>>1;
127         if(OK(mid)){
128             ans=mid;
129             r=mid-1;
130         }else{
131             l=mid+1;
132         }
133     }
134     printf("%d\n",ans);
135     return 0;
136 }
137
138 /*
139
140 */

转载于:https://www.cnblogs.com/fengzhiyuan/p/8531003.html

bzoj 4443 [Scoi2015]小凸玩矩阵 网络流,二分相关推荐

  1. bzoj 4443: [Scoi2015]小凸玩矩阵(二分+二分匹配)

    4443: [Scoi2015]小凸玩矩阵 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1002  Solved: 505 [Submit][St ...

  2. BZOJ 4443: [Scoi2015]小凸玩矩阵

    二次联通门 : BZOJ 4443: [Scoi2015]小凸玩矩阵 /*BZOJ 4443: [Scoi2015]小凸玩矩阵本来以为是道数据结构题后来想了想发现不可做就考虑二分dp判断推方程推不出来 ...

  3. [Scoi2015]小凸玩矩阵

    bzoj 4443: [Scoi2015]小凸玩矩阵 http://www.lydsy.com/JudgeOnline/problem.php?id=4443 Time Limit: 10 Sec   ...

  4. bzoj 4446: [Scoi2015]小凸玩密室

    Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 115  Solved: 20 [Submit][Status][Discuss] Descripti ...

  5. [SCOI2015]小凸玩矩阵 (匈牙利+二分)

    description 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M(N≤M)的矩阵 A,要求小凸从其中选出 N 个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的 N 个数中第 ...

  6. 【bzoj4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配

    题目描述 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最小值是多少. ...

  7. 网络流学习总结和省选专练SCOI2015小凸玩矩阵

    这是四川连着第几个年头考二分套网络流了? 虽然这是一个二分图最大匹配,但是我匈牙利写挂了. 我太弱了. 好了不瞎扯牛逼了,这个题这么搞: 首先题目就告诉你求第k大最小. 首先这就让人瑟瑟发抖....第 ...

  8. bzoj4443:[Scoi2015]小凸玩矩阵

    传送门 二分答案是显然的啊,然后对于比二分出的值大的直接跑最大匹配,然后判定就好了 代码: #include<cstdio> #include<iostream> #inclu ...

  9. bzoj-4433 小凸玩矩阵(二分图,二分+匈牙利)

    4443: [Scoi2015]小凸玩矩阵 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列, ...

最新文章

  1. “六神”——技术提高开发效率的一个方案
  2. 推荐系统笔记:基于非负矩阵分解的协同过滤
  3. java word添加图片_Java 替换word文档文字并指定位置插入图片
  4. 小议ASP.NET模板引擎技术的使用
  5. mysql事务与jdbc事务_事务(mysql事务、jdbc事务)
  6. Hive+LDAP+Sentry
  7. 深层神经网络——多层网络解决异或运算
  8. linux设置开机启动 服务不支持chkconfig解决方法脚本
  9. 关于明星投票系统的作业分享
  10. Mark:SQL Server关于CAST和CONVERT的区别和用法
  11. uni-app做收货地址功能
  12. DEA模型及matlab应用2:超效率SE-DEA模型
  13. 本科课程【数字图像处理】实验1 - 腐蚀与膨胀
  14. 【无限互联】SDWebImage图片缓存流程分析
  15. PHPExcel 锁定表头 设置样式,背景颜色,居中,宽,单元格合并
  16. win10不用密码直接登陆设置
  17. 为什么要学Markdown?有什么用?
  18. 隐患重重遭诟病 细数固态硬盘“七宗罪”
  19. Next '21 大会倒计时 1 天丨与 Google Cloud 一起寻找打开数字化的“云钥匙”
  20. 华为 ACL与DHCP配置

热门文章

  1. Django完整配置settings.py
  2. ssm整合之五 分页以及按时间查询
  3. ssh html项目,SSH项目-学生管理系统
  4. oracle em 空白,Oracle em中出现按钮乱码的实际解决方案
  5. 开启mybatis日志_Mybatis源码分析之Cache二级缓存原理 (五)
  6. nginx/tengine设置响应头中的cookie属性
  7. js发送get、post请求的方法简介
  8. LINUX ltrace命令-用来跟踪进程调用库函数的情况学习
  9. 使用python调用matlab方法
  10. 用pandas填充时间序列缺失值