HDU 2119
来源:互联网 发布:淘宝等级怎么升 编辑:程序博客网 时间:2024/06/08 18:21
Matrix
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2118 Accepted Submission(s): 935
Problem 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.
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.
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 01 0 10 1 00
Sample Output
2
Author
Wendell
Source
HDU 2007-10 Programming Contest_WarmUp
题意:
选择某一行或者某一列,删除一,使其变为0,问最少需要几次这样的操作才能把所有的元素变为0。
思路:对i,j建边,,所以,,
问题就转化为2分匹配,
也就是,最小顶点的覆盖,,
根据图论知识,最小定点覆盖等于最大匹配。。
so
跑个2分匹配就是答案。。
#include <stdio.h>#include <cstring>#include <cmath>#include <cstdlib>#include <iostream>#include <algorithm>#include <queue>#include <map>#include <vector>using namespace std;#define mod 1000000007#define inf 0x7f7f7f7fint vis[505];int pre[505];int mat[505][505];int n,m,ans;int find(int x){ int i; for(i=1;i<=m;i++) { if(!vis[i]&&mat[x][i]) { vis[i]=1; if(pre[i]==-1 ||find(pre[i])) { pre[i]=x; return 1; } } } return 0;}int init(){ int i; ans=0; memset(pre,-1,sizeof(pre)); for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(find(i)) ans++; } return ans;}int main(){ int i,j; while(cin>>n,n) { cin>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>mat[i][j]; int ans1=init(); cout<<ans1<<endl; } return 0;}
0 0
- hdu 2119
- HDU 2119
- hdu 2119
- HDU 2119 Matrix
- hdu 2119 Matrix
- HDU 2119 Matrix
- hdu 2119 Matrix
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- 【转载】经营成功的测试生涯
- HashSet,TreeSet 和 LinkedHashSet比较
- C#将Unicode编码转换为汉字字符串
- 为什么重写equals方法,一定要重写HashCode方法?
- 编程个人体会
- HDU 2119
- Bootstrap入门速成-效果概述
- Fisher vector
- 051.17
- DOS环境下MySQL使用及不同字符集之间的转换
- 杭电ACM——自我强化步骤
- Android内存泄露分析简要思路
- 编写高质量IOS代码(一)
- 啤酒和饮料之浮点数的大小比较不能用==号