BZOJ 4443: [Scoi2015]小凸玩矩阵 二分图最大匹配+二分
2016-05-24 15:42
555 查看
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=4443题解:
二分答案,判断最大匹配是否>=n-k+1;#include<iostream> #include<cstdio> #include<cstring> #include<vector> using namespace std; const int maxn=255; const int INF=1e9; int mat[maxn][maxn]; int n,m,k; int lef[maxn],_t[maxn]; vector<int> G[maxn]; bool match(int i){ for(int j=0;j<G[i].size();j++){ int v=G[i][j]; if(_t[v]==0){ _t[v]=1; if(!lef[v]||match(lef[v])){ lef[v]=i; return true; } } } return false; } bool check(int x){ for(int i=1;i<=n;i++) G[i].clear(); memset(lef,0,sizeof(lef)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(mat[i][j]<=x) G[i].push_back(j); } } for(int i=1;i<=n;i++){ memset(_t,0,sizeof(_t)); match(i); } int cnt=0; for(int i=1;i<=m;i++){ if(lef[i]) cnt++; } if(cnt>=n-k+1) return true; return false; } int main(){ while(scanf("%d%d%d",&n,&m,&k)==3&&n){ for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&mat[i][j]); } } int low=0,hig=INF; while(low<hig-1){ int mid=low+(hig-low)/2; if(check(mid)) hig=mid; else low=mid; } printf("%d\n",hig); } return 0; }
相关文章推荐
- Java 通过JDBC连接Mysql数据库的方法和实例
- iOS应用架构谈(一):架构设计的方法论
- Android 属性动画
- 主流ios应用兼容ipv6only测试
- 不同平台之间的 DB2 数据库迁移一例
- [Java]ThreadPoolExecutor源码分析
- 浏览器与cdn缓存
- 一、svg的四种使用方式
- js 巧妙去除数组中的重复项
- thinkphp自动验证无效的问题
- Part 2: Oracle E-Business Suite on Cloud FAQ
- GATK best practices对variation(only for SNPs and Indels)的鉴定以及对上游数据对处理
- ORACLE表空间
- Java基础第十一天_集合
- 新记录插入表中时生成一个唯一的数字
- 陀螺仪传感器与方向传感器的区别
- 第十三周实践项目1————分数类运算符重载(4)
- oarcle 11g 安装
- Keil的堆设置
- Hibernate 5.1概述