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.
 

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 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
原创粉丝点击