[luogu4251 SCOI2015] 小凸玩矩阵 (二分图最大匹配)
Description
Input
Output
输出包含一行,为选出的 n 个数中第 k 大数的最小值。
Sample Input
输入样例1:
2 3 1
1 2 4
2 4 1
输入样例2:
3 4 2
1 5 6 6
8 3 4 3
6 8 6 3
Sample Output
输出样例1:
1
输出样例2:
3
HINT
Solution
k大值最小,显然可以二分
对于mid若它是第k大数,则一定存在>=n-k-1个比mid小的数
用最大匹配的结果和n-k比较即可
Code
//By Menteur_Hxy
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define int long long
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
#define ins(a,b,c) add(a,b,c),add(b,a,0)
#define add(a,b,c) nxt[++cnt]=head[a],to[cnt]=b,cst[cnt]=c,head[a]=cnt
using namespace std;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=1010,INF=0x3f3f3f3f;
int n,m,k,ans,cnt,S,T;
int nxt[N*N],to[N*N],cst[N*N],head[N<<1],cur[N*N];
int da[N][N],dis[N<<1],que[N<<1];
bool bfs() {
memset(dis,0,sizeof(dis));
int h=0,t=1; que[++h]=S; dis[S]=1;
while(h<=t) {
int u=que[h++];
// cout<<u<<" "<<dis[u]<<endl;
E(i,u) if(!dis[to[i]]&&cst[i]>0)
dis[to[i]]=dis[u]+1,que[++t]=to[i];
}
return dis[T]>0;
}
int dfs(int u,int flow) {
if(u==T) return flow;
int used=0;
for(register int &i=cur[u],v;i;i=nxt[i])
if(cst[i]>0&&dis[(v=to[i])]==dis[u]+1) {
// cout<<u<<" "<<v<<endl;
int tmp=dfs(v,min(flow-used,cst[i]));
// cout<<min(flow-used,cst[i])<<" "<<tmp<<endl;
cst[i]-=tmp; cst[i^1]+=tmp;
used+=tmp; if(used==flow) return flow;
}
if(!used) dis[u]=-1;
return used;
}
int dinic() {
int res=0;
while(bfs()) {
// cout<<dis[T]<<endl;
F(i,0,n+m+1) cur[i]=head[i];
res+=dfs(S,INF);
}
return res;
}
bool jud(int x) {
cnt=1;
memset(head,0,sizeof(head));
F(i,1,n) ins(S,i,1); F(i,1,m) ins(i+n,T,1);
F(i,1,n) F(j,1,m) if(da[i][j]<=x) ins(i,j+n,1);
int res=dinic();
return res>n-k;
}
signed main() {
// freopen("1.txt","r",stdin);
n=read(),m=read(),k=read();
S=0; T=n+m+1; ans=INF;
int l=INF,r=0;
F(i,1,n) F(j,1,m)
da[i][j]=read(),l=min(l,da[i][j]),r=max(r,da[i][j]);
while(l<=r) {
int mid=(l+r)>>1;
// cout<<mid<<endl;
if(jud(mid)) ans=min(ans,mid),r=mid-1;
else l=mid+1;
}
printf("%lld",ans);
return 0;
}
[luogu4251 SCOI2015] 小凸玩矩阵 (二分图最大匹配)的更多相关文章
- BZOJ 4443: [Scoi2015]小凸玩矩阵 二分图最大匹配+二分
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4443 题解: 二分答案,判断最大匹配是否>=n-k+1: #include< ...
- 【BZOJ4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配
[BZOJ4443][Scoi2015]小凸玩矩阵 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或 ...
- BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配
BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个 ...
- 2018.06.30 BZOJ4443: [Scoi2015]小凸玩矩阵(二分加二分图匹配)
4443: [Scoi2015]小凸玩矩阵 Time Limit: 10 Sec Memory Limit: 128 MB Description 小凸和小方是好朋友,小方给小凸一个N*M(N< ...
- BZOJ 4443: [Scoi2015]小凸玩矩阵 最大流
4443: [Scoi2015]小凸玩矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4443 Description 小凸和小方是好 ...
- bzoj 4443 [Scoi2015]小凸玩矩阵 网络流,二分
[Scoi2015]小凸玩矩阵 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1564 Solved: 734[Submit][Status][Di ...
- 【bzoj4443】【[Scoi2015]小凸玩矩阵】二分+二分图最大匹配
(上不了p站我要死了,侵权度娘背锅) Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸 ...
- bzoj 4443: [Scoi2015]小凸玩矩阵
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 149 Solved: 81[Submit][Status][Discuss] Description ...
- 【刷题】BZOJ 4443 [Scoi2015]小凸玩矩阵
Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最 ...
随机推荐
- ubuntu上java的运行环境jre的安装
如何在Ubuntu 14.04上面安装 java的运行环境 jre 呢,下面直接采用到 oracle 的java 官网下载 对应的 jre 的tar.gz的包 从 root用户切换到 saynoer ...
- [Jest] Write data driven tests in Jest with test.each
Often, we end up creating multiple unit tests for the same unit of code to make sure it behaves as e ...
- XMPP基本内容简单介绍
即时通讯技术简单介绍 即时通讯技术(IM)支持用户在线实时交谈.假设要发送一条信息,用户须要打开一个小窗体,以便让用户及其朋友在当中输入信息并让交谈两方都看到交谈的内容.有很多的IM系统,如AOL I ...
- jsp上传下载+SmartUpload插件上传
使用之前须要自己下载jspSmartUpload.jar包 这里找到一个支持中文的jar包,下载地址例如以下: http://www.blogjava.net/Files/hijackwust/jsm ...
- 2014秋C++ 第8周项目 分支程序设计
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703.课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课 ...
- Java集合类汇总记录--guava篇
BiMap HashBiMap<K,V> 实现了两份哈希表数据结构(本类独立实现).分别负责两个方向的映射. EnumBiMap<K,V> 两个EnumMap对象分别负责两个方 ...
- HDU 3656 二分+dlx判定
Fire station Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- EF + WCF学习笔记——EF实体类序列化
项目中如果 EF + WCF 结合使用,模式应该是EF负责读取数据库,传递数据对象给WCF,WCF再将这些对象传送给客户端.因为WCF传送的对象需要序列化,而EF默认生成的对象并没有序列化,很可能会出 ...
- THRDTERM-----干净地结束一个线程
THRDTERM产生两个线程.周期性地检查一个event对象.以决定要不要结束自己. #define WIN32_LEAN_AND_MEAN #include<stdio.h> #incl ...
- vim copy termi
用vim写代码时,经常遇到这样的场景,复制多行,然后粘贴. 这样做:1. 将光标移动到要复制的文本开始的地方,按v进入可视模式.2. 将光标移动到要复制的文本的结束的地方,按y复制.此时vim会自动将 ...