hdu 2119 Matrix(二分最大匹配)
2014-08-25 22:10
288 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2119
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
3 3
0 0 0
1 0 1
0 1 0
0
[align=left]Sample Output[/align]
2
[align=left]Author[/align]
Wendell
[align=left]Source[/align]
HDU 2007-10 Programming Contest_WarmUp
题意,给你一个0、1矩阵,每次可以消去一行或者一列的1,问最少的次数消去所有的1。以行和列为左右集,建二分图,然后求二分最大匹配。
代码:
#include<stdio.h>
#include<string.h>
const int maxn=110;
int mp[maxn][maxn];
int vis[maxn];
int nx,ny,cx[maxn],cy[maxn];
int n,m;
int find(int u)
{
for(int i=1;i<=ny;i++)
{
if(mp[u][i]&&!vis[i])
{
vis[i]=1;
if(cy[i]==-1||find(cy[i]))
{
cy[i]=u;
cx[u]=i;
return 1;
}
}
}
return 0;
}
void match()
{
int res=0;
memset(cy,-1,sizeof(cy));
memset(cx,-1,sizeof(cx));
for(int i=1;i<=nx;i++)
{
if(cx[i]==-1)
{
memset(vis,0,sizeof(vis));
res+=find(i);
}
}
printf("%d\n",res);
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
memset(mp,0,sizeof(mp));
nx=n;
ny=m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int num;
scanf("%d",&num);
if(num)
mp[i][j]=1;
}
}
match();
}
return 0;
}
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
3 3
0 0 0
1 0 1
0 1 0
0
[align=left]Sample Output[/align]
2
[align=left]Author[/align]
Wendell
[align=left]Source[/align]
HDU 2007-10 Programming Contest_WarmUp
题意,给你一个0、1矩阵,每次可以消去一行或者一列的1,问最少的次数消去所有的1。以行和列为左右集,建二分图,然后求二分最大匹配。
代码:
#include<stdio.h>
#include<string.h>
const int maxn=110;
int mp[maxn][maxn];
int vis[maxn];
int nx,ny,cx[maxn],cy[maxn];
int n,m;
int find(int u)
{
for(int i=1;i<=ny;i++)
{
if(mp[u][i]&&!vis[i])
{
vis[i]=1;
if(cy[i]==-1||find(cy[i]))
{
cy[i]=u;
cx[u]=i;
return 1;
}
}
}
return 0;
}
void match()
{
int res=0;
memset(cy,-1,sizeof(cy));
memset(cx,-1,sizeof(cx));
for(int i=1;i<=nx;i++)
{
if(cx[i]==-1)
{
memset(vis,0,sizeof(vis));
res+=find(i);
}
}
printf("%d\n",res);
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
scanf("%d",&m);
memset(mp,0,sizeof(mp));
nx=n;
ny=m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int num;
scanf("%d",&num);
if(num)
mp[i][j]=1;
}
}
match();
}
return 0;
}
相关文章推荐
- hdu 2119 Matrix 二分图匹配(最大匹配)
- hdu 2063 过山车 + hdu 2119 Matrix (二分图的最大匹配边和最小覆盖点)
- hdu 2119 Matrix【最小点覆盖-二分匹配】
- Hdu 2119 Matrix 二分图的最大匹配
- hdu 2119 Matrix(二分匹配)
- HDU 2119 Matrix 简单二分匹配
- hdu 2119 Matrix(二分匹配)
- HDU 2444 The Accomodation of Students 判断是否为二分匹配+求最大匹配数
- hdu 4619 (二分匹配,最大匹配)
- HDU1498 二分匹配+最大顶点覆盖
- HDU 4160 最小路径覆盖 = 顶点数 - 最大匹配数 二分匹配
- HDU 2819 Swap (最大二分匹配+输出路径)
- HDU-1150(求最小覆盖顶点数=二分最大匹配数)
- HDU 1083 Courses (二分最大匹配)
- HDU-1498(二分匹配_求最大覆盖定点数)
- HDU 2236 矩阵不同行列寻找 最小最大数的差值 最小 二分匹配+二分枚举区间
- hdu 4619 Warm up 2(最大独立点集,二分匹配,4级)
- HDU 3829 Cat VS Dog (二分匹配求最大独立集)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)
- hdu 1068 Girls and Boys(最大独立集,二分匹配)