hdu 2119 Matrix(二分匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2119

Matrix

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2205    Accepted Submission(s):
975

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 0

1 0 1

0 1 0

0

Sample Output

2

Author

Wendell

Source

HDU
2007-10 Programming Contest_WarmUp

题目大意:将矩阵所给的1全部变成0,每次改变可以变换一行或者一列。问最少多少次,可以使矩阵里的所有元素全部变为0?

解题思路:将横坐标X看做二分图的左支,纵坐标Y看做二分图的右支。求二分图的最小点覆盖=二分图的最匹配数。

详见代码。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4
 5 using namespace std;
 6
 7 int vis[110],Map[110][110];
 8 int ok[110],n,m;
 9
10 bool Find(int x)
11 {
12     for (int i=0;i<m;i++)
13     {
14         if (Map[x][i]==1&&!vis[i])
15         {
16             vis[i]=1;
17             if (ok[i]==-1)
18             {
19                 ok[i]=x;
20                 return true;
21             }
22             else
23             {
24                 if (Find(ok[i])==true)
25                 {
26                     ok[i]=x;
27                     return true;
28                 }
29             }
30         }
31     }
32     return false;
33 }
34
35 int main()
36 {
37     int ans;
38     while (~scanf("%d",&n))
39     {
40         ans=0;
41         if (n==0)
42             break;
43         scanf("%d",&m);
44         memset(Map,0,sizeof(Map));
45         memset(ok,-1,sizeof(ok));
46         for (int i=0;i<n;i++)
47         {
48             for (int j=0;j<m;j++)
49             {
50                 scanf("%d",&Map[i][j]);
51             }
52         }
53         for (int i=0;i<n;i++)
54         {
55             memset(vis,0,sizeof(vis));
56             if (Find(i))
57             {
58                 ans++;
59             }
60         }
61         printf ("%d\n",ans);
62     }
63     return 0;
64 }
时间: 2024-10-14 17:06:06

hdu 2119 Matrix(二分匹配)的相关文章

HDU 2119 Matrix 简单二分匹配

行做x集,列做y集,1就给该行该列连一条边,输出最大匹配边即可 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<set> using namespace std; #define N 105 int lef[N], pn;//lef[v]表示Y集的点v 当前连接的点 , pn为x点集的

Hdu 1045 二分匹配

题目链接 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6282    Accepted Submission(s): 3551 Problem Description Suppose that we have a square city with straight streets. A map of a city i

HDU 2819 Swap (二分匹配+破输出)

题意:给定上一个01矩阵,让你变成一个对角全是 1 的矩阵. 析:二分匹配,把行和列看成两个集合,用匈牙利算法就可以解决,主要是在输出解,在比赛时一紧张不知道怎么输出了. 输出应该是要把 match[i] = i 这样的输出,然后再改掉后面那个,真是个大傻逼输出,气死了..... 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <strin

hdu 3081 【二分匹配+并查集+删边||最大路+并查集+二分枚举】

Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2307    Accepted Submission(s): 792 Problem Description Presumably, you all have known the question of stable marriage match. A

hdu 2119 Matrix

Matrix http://acm.hdu.edu.cn/showproblem.php?pid=2119 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Give you a matrix(only contains 0 or 1),every time you can select a row or a column and dele

HDU 2819 — Swap 二分匹配

Swap Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2174    Accepted Submission(s): 774Special Judge Problem Description Given an N*N matrix with each entry equal to 0 or 1. You can swap any tw

Hdu 1281 棋盘游戏 (二分匹配)

题目链接: Hdu 1281 棋盘游戏 题目描述: 题目汉语,只说一点,国际象棋中车的攻击范围就像n皇后问题中的皇后一样,同行和同列的车都会相互攻击. 解题思路: 求出来的最大匹配数目==最多能放几个车.计算有几个格子是重要点的时候只需要算出最大的匹配数目,然后枚举每个点不能放置棋子时候的最大匹配数目.最大匹配数目小于原匹配数目的时候,当前枚举点就是重要点. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostre

hdu 2063 (二分匹配 匈牙利算法)

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 22693    Accepted Submission(s): 9797 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par

HDU——2119 Matrix

    题目大意: 给你一个矩阵(只包含0或1),每次你可以选择一行或一列,并删除这一行或这个列中的所有“1”.您的任务是给出删除矩阵中所有“1”的最小时间. 思路: 我们要将所有的1都删去,那样我们对于1的位置的行与列连边,再把这两个(列和边)看作是两个集合.求它的最大匹配数. 一个很简单的二分图的板子.. 代码: #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream>