【二分图匹配入门专题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;
}

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

二分图中对最小顶点覆盖、最小边覆盖、最大独立集的理解

仅仅用于自己理解,若有共鸣,别太吐槽就行哈~ 首先是匈牙利算法的本质:(图参考了zxy的) 这个图要详细看完,那么刚开始我想的“找小三”实际上就是递归找增广路的过程,如果找到增广路,匹配数...
  • Flynn_curry
  • Flynn_curry
  • 2016年10月29日 20:01
  • 2450

二分图最大匹配,最小路径覆盖,最小点覆盖,最大独立集,最小边覆盖与建图方法

前言:         有自己写的,有摘的别人的,前面是摘的,也是无心整理,出错是难免的,反正我都不会证明,智人见智,别被我误导了。 §1图论点、边集和二分图的相关概念和性质 点覆盖、最小点覆盖...
  • hitwhacmer1
  • hitwhacmer1
  • 2015年07月02日 01:10
  • 2721

二分图 最小覆盖数 = 最大匹配数、最大独立集 = 总数-最小覆盖集 证明 hdu 1068

二分图有两个定理:最小覆盖数=最大匹配数、最大独立集=总数-最小覆盖集 。 这里来给出证明(如果还不懂匈牙利算法,请先看之前写的一篇)匈牙利算法链接 几个基本定义: 最小覆盖:即在所有顶点中选择最少的...
  • Techmonster
  • Techmonster
  • 2015年11月24日 13:19
  • 2063

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

题意:给你一个N*M的0/1矩阵,你每次可以选特定的某行或某列,然后删除该行/列的所有1,问你最少需要几次操作能删除矩阵的所有1. 思路:二分图简单题,前面好像有几道都与本题类似.      ...
  • qq_21057881
  • qq_21057881
  • 2016年02月16日 20:38
  • 219

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

HDU 2119 Matrix(二分图最小边覆盖) http://acm.hdu.edu.cn/showproblem.php?pid=2119 题意:        给你一个N*M的0/1矩阵,你每...
  • u013480600
  • u013480600
  • 2014年08月22日 20:02
  • 806

HDU 2119--Matrix【二分图 && 最小点数覆盖】

题意: 给你一个N*M的矩阵,矩阵里面有一些位置是1。每次操作可以划去同一行或者同一列的1,问你最少需要几次操作。 解析: 最小点数覆盖的水题,没啥好说的。根据矩阵建好关系图,直接匈牙利就行了。...
  • hpuhjh
  • hpuhjh
  • 2015年09月23日 16:58
  • 229

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

#include #include #include #include #include #include using namespace std; const int maxn=1510...
  • a601025382s
  • a601025382s
  • 2013年09月06日 20:51
  • 1230

HDU 1150 Machine Schedule(匈牙利算法 二分图的最小顶点覆盖 二分图最大匹配)

简单的求二分图最大匹配的
  • desire_ing
  • desire_ing
  • 2014年07月28日 21:55
  • 444

CUGB图论专场2:B - Asteroids 二分图:最小顶点覆盖=最大匹配数

B - Asteroids Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit St...
  • u011466175
  • u011466175
  • 2014年02月15日 13:22
  • 938

poj3041-Asteroids , 二分图的最小顶点覆盖数 = 最大匹配数

点击打开链接 二分图的最小顶点覆盖数 = 二分图的最大匹配数 题意: 在N*N的网络中有K颗小行星。小行星i的位置是(Ri, Ci)。现在有一个强力的武器能够用一发光束将一整行或一整列的小行星消灭...
  • yew1eb
  • yew1eb
  • 2014年07月12日 00:17
  • 1909
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【二分图匹配入门专题1】D - Matrix hdu2119【最小顶点覆盖】
举报原因:
原因补充:

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