您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: