BZOJ 4443(SCOI2015)网络流+二分答案 解题报告
2017-05-30 10:35
465 查看
4443: [Scoi2015]小凸玩矩阵
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
【解题报告】
网络流+二分答案
代码如下:
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
【解题报告】
网络流+二分答案
代码如下:
#include<queue> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 511 #define inf 0x7fffffff struct edge { int to,next,w; }G[maxn*maxn]; int n,m,a[maxn][maxn],tot=1,h[maxn],S,T; int cur[maxn],vis[maxn],mx=0,k; void add(int x,int y,int z) { G[++tot].to=y;G[tot].next=h[x];h[x]=tot;G[tot].w=z; G[++tot].to=x;G[tot].next=h[y];h[y]=tot;G[tot].w=0; } bool bfs() { for(int i=S;i<=T;++i) vis[i]=-1; queue<int>q; q.push(S); vis[S]=0; while(!q.empty()) { int u=q.front(); q.pop(); for(int i=h[u];i;i=G[i].next) { int v=G[i].to; if(vis[v]==-1&&G[i].w) { vis[v]=vis[u]+1; q.push(v); } } } return vis[T]!=-1; } int dfs(int x,int f) { if(x==T||f==0) return f; int w,used=0; for(int i=cur[x];i;i=G[i].next) if(vis[G[i].to]==vis[x]+1) { w=f-used; w=dfs(G[i].to,min(w,G[i].w)); G[i].w-=w; G[i^1].w+=w; used+=w; if (G[i].w) cur[x]=i; if (used==f) return f; } if(!used) vis[x]=-1; return used; } int dinic() { int ret=0; while(bfs()) { for(int i=S;i<=T;++i) cur[i]=h[i]; ret+=dfs(S,inf); }return ret; } bool check(int x) { memset(h,0,sizeof(h)); tot=1; for(int i=1;i<=n;++i) add(S,i,1); for(int i=1;i<=m;++i) add(i+n,T,1); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if (a[i][j]<=x) add(i,j+n,1); int ret=dinic(); if(ret>=n-k+1) return 1; else return 0; } int main() { scanf("%d%d%d",&n,&m,&k); S=0; T=n+m+1; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { scanf("%d",&a[i][j]); mx=max(mx,a[i][j]); } int l=0,r=mx; while(l<r) { int mid=(l+r)>>1; if(check(mid)) r=mid; else l=mid+1; } printf("%d\n",l); return 0; }
相关文章推荐
- bzoj 4443: [Scoi2015]小凸玩矩阵 二分答案+网络流
- BZOJ 3993 [SDOI 2015] 网络流+二分答案 解题报告
- [BZOJ]4443 [SCOI2015] 小凸玩矩阵 二分答案 + 二分图最大匹配
- [BZOJ4443][Scoi2015]小凸玩矩阵(二分答案+二分图匹配)
- BZOJ 1822 计算几何+网络流+二分答案 解题报告
- BZOJ 4443: [Scoi2015]小凸玩矩阵 二分 网络流
- [bzoj4443][Scoi2015]小凸玩矩阵(二分答案+二分图最大匹配)
- 匈牙利算法+二分答案 BZOJ 4443 小凸玩矩阵 SCOI 2015 题解
- BZOJ 4443 [Scoi2015]小凸玩矩阵(二分答案+二分图匹配)
- BZOJ 3993 [SDOI2015]星际战争 | 网络流 二分答案
- BZOJ4443[Scoi2015][小凸玩矩阵] 二分图最大匹配+二分
- bzoj 4443: [Scoi2015]小凸玩矩阵(二分+二分匹配)
- BZOJ4952 [Wf 2017] 二分答案 解题报告
- 【bzoj4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配
- 【bzoj4443】[Scoi2015]小凸玩矩阵 二分+二分图匹配
- 【BZOJ4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配
- BZOJ4444: [Scoi2015]国旗计划 解题报告
- [二分+二分图匹配]BZOJ 4443: [Scoi2015]小凸玩矩阵 题解
- 4443: [Scoi2015]小秃玩矩阵 二分答案+最大流
- BZOJ 2792 [POI 2012] 二分答案 解题报告