【二分图匹配入门专题1】D - Matrix hdu2119【最小顶点覆盖】

原创 2017年08月13日 06:30:21
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.

InputThere 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. 
OutputFor 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

题意:输入n行m列的数,这些数只有1或0组成,每次可以消掉一行或者一列的1,问,消灭掉全部的1最少需要进行多少次操作
思路:我二分图匹配模型还是没有转换过来,但是队友给我讲了以后,豁然开朗,矩阵的行x就相当于左集合,矩阵的列y就相当于
右集合,要使1被消灭,就相当于连通(x,y),求最少需要多少次操作可以连通所有1的(x,y)这不就是最小顶点覆盖吗。
sum没有初始化样例也能过,但是wrong了三次后才发现是这个原因,尴尬~~
#include<stdio.h>
#include<string.h>
#define N 110

int book[N],e[N][N],match[N];
int n,m;

int dfs(int u)
{
    int i;
    for(i = 1; i <= m; i ++)
    {
        if(!book[i]&&e[u][i])
        {
            book[i] = 1;
            if(!match[i]||dfs(match[i]))
            {
                match[i] = u;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int i,j,sum;
    while(scanf("%d",&n),n!=0)
    {
        scanf("%d",&m);
        memset(match,0,sizeof(match));
        memset(e,-1,sizeof(e));
        for(i = 1; i <= n; i ++)
            for(j = 1; j <= m; j ++)
                scanf("%d",&e[i][j]);
        sum = 0;
        for(i = 1; i <= n; i ++)
        {
            memset(book,0,sizeof(book));
            if(dfs(i))
                sum ++;
        }
        printf("%d\n",sum);
    }
    return 0;
}

版权声明:转载的时候给我说一声哦~~~

相关文章推荐

HDU 2119 Matrix(二分图最小边覆盖)

HDU 2119 Matrix(二分图最小边覆盖) http://acm.hdu.edu.cn/showproblem.php?pid=2119 题意:        给你一个N*M的0/1矩阵,你每...

hdu 1054 Strategic Game 最小顶点覆盖(二分图最大匹配)

#include #include #include #include #include #include using namespace std; const int maxn=1510...

Machine Schedule HDoj (二分图最小顶点覆盖--最大匹配数)

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...

HDU 1054 Strategic Game 二分图 最小顶点覆盖

做该题要掌握以下两点: 1、二分图最小顶点覆盖 = 双向二分图最大匹配 / 2 。 2、利用STL中的vector的可以很方便的建立图的邻接表存储。主要用到push_back()、clear()操...

hdu1150(二分图最小顶点覆盖)

Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...

HDU1150-- Machine Schedule( 二分图最小顶点覆盖)

当做模板来用吧.. #include #include int n1,n2,m,ans; int result[1005]; int state[1005]; int maps[1005][100...

hdu 1150二分图最小顶点覆盖

题目大意: 有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务都恰好在一台机器上运行。 如果它在机器A上运行,则机器A需要设置为模式xi,如果它在机器B上运行,则机器A需...
  • vsooda
  • vsooda
  • 2012年04月10日 22:46
  • 1413

hdu 1054 Strategic Game (二分图 最小顶点覆盖)

Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others...
  • caduca
  • caduca
  • 2014年09月05日 10:41
  • 447

二分图最大匹配的König定理-最小点集覆盖【Matrix67】

König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数。如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选了一个点就相当于覆盖了以它为端点的所有...

hdu 1498(二分图最小顶点覆盖)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1498 解题思路: 这题看上去很和二分图的最小顶点覆盖很相似,但关键怎么处理多个不同颜色的气球。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【二分图匹配入门专题1】D - Matrix hdu2119【最小顶点覆盖】
举报原因:
原因补充:

(最多只允许输入30个字)