HDU 2119 Matrix(二分图最小边覆盖)
2016-02-16 20:38
375 查看
题意:给你一个N*M的0/1矩阵,你每次可以选特定的某行或某列,然后删除该行/列的所有1,问你最少需要几次操作能删除矩阵的所有1.
思路:二分图简单题,前面好像有几道都与本题类似.
建图:把行号放在二分图左边点集,列号放在右边点集.如果(i,j)格子是1,那么就连左i与右j的无向边.
本题的问题就是求该二分图的最小边覆盖点集.使得每条边都被至少1个点覆盖. 最小覆盖集大小==最大匹配数.
Description
Give you a matrix(only contains 0 or 1),every time you can select a row or a column and delete all the '1' in this row or this column .
Your task is to give out the minimum times of deleting all the '1' in the matrix.
Input
There are several test cases.
The first line contains two integers n,m(1<=n,m<=100), n is the number of rows of the given matrix and m is the number of columns of the given matrix.
The next n lines describe the matrix:each line contains m integer, which may be either ‘1’ or ‘0’.
n=0 indicate the end of input.
Output
For each of the test cases, in the order given in the input, print one line containing the minimum times of deleting all the '1' in the matrix.
Sample Input
Sample Output
思路:二分图简单题,前面好像有几道都与本题类似.
建图:把行号放在二分图左边点集,列号放在右边点集.如果(i,j)格子是1,那么就连左i与右j的无向边.
本题的问题就是求该二分图的最小边覆盖点集.使得每条边都被至少1个点覆盖. 最小覆盖集大小==最大匹配数.
#include<cstdio> #include<cstring> #include<vector> using namespace std; const int maxn=100+5; struct Max_Match { int n,m; vector<int> g[maxn]; bool vis[maxn]; int left[maxn]; void init(int n,int m) { this->n=n; this->m=m; for(int i=1;i<=n;i++) g[i].clear(); memset(left,-1,sizeof(left)); } bool match(int u) { for(int i=0;i<g[u].size();i++) { int v=g[u][i]; if(!vis[v]) { vis[v]=true; if(left[v]==-1 || match(left[v])) { left[v]=u; return true; } } } return false; } int solve() { int ans=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(match(i)) ++ans; } return ans; } }MM; int main() { int n,m; while(scanf("%d",&n)==1 && n) { scanf("%d",&m); MM.init(n,m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { int v; scanf("%d",&v); if(v) MM.g[i].push_back(j); } printf("%d\n",MM.solve()); } return 0; }
Description
Give you a matrix(only contains 0 or 1),every time you can select a row or a column and delete all the '1' in this row or this column .
Your task is to give out the minimum times of deleting all the '1' in the matrix.
Input
There are several test cases.
The first line contains two integers n,m(1<=n,m<=100), n is the number of rows of the given matrix and m is the number of columns of the given matrix.
The next n lines describe the matrix:each line contains m integer, which may be either ‘1’ or ‘0’.
n=0 indicate the end of input.
Output
For each of the test cases, in the order given in the input, print one line containing the minimum times of deleting all the '1' in the matrix.
Sample Input
3 3 0 0 0 1 0 1 0 1 0 0
Sample Output
2
相关文章推荐
- 【走过的弯路】 半波阻容电路输出电流计算
- 贸易
- bzoj-2434: [Noi2011]阿狸的打字机
- sql 查看创建几个数据库
- 6种编写HTML和CSS的最有效的方法
- java中的分代垃圾回收策略
- bzoj-1076[SCOI2008]奖励关
- git 教程
- C++运算符优先级列表
- HDU2546 01背包
- 【转】高斯消元模板 by kuangbin
- Linux - Eclipse CDT + GCC 安装(2014.10.2)
- Sublime Text编辑器
- EJB的分类简介
- Intel X86 CPU寄存器学习笔记
- Lambda表达式
- bzoj-1103 [POI2007]大都市meg
- Java读写.ini文件
- BAT及各大互联网公司2014前端笔试面试题:HTML/CSS篇
- 2016的道路:一年之计在于春