首页 > 代码库 > HDU——2119 Matrix

HDU——2119 Matrix

技术分享

   技术分享

题目大意:

给你一个矩阵(只包含0或1),每次你可以选择一行或一列,并删除这一行或这个列中的所有“1”。您的任务是给出删除矩阵中所有“1”的最小时间。

思路:

我们要将所有的1都删去,那样我们对于1的位置的行与列连边,再把这两个(列和边)看作是两个集合。求它的最大匹配数。

一个很简单的二分图的板子。。

代码:

#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#define N 110using namespace std;bool vis[N];int n,m,ans,girl[N],map[N][N];int read(){    int x=0,f=1; char ch=getchar();    while(ch<0||ch>9) {if(ch==-) f=-1; ch=getchar();}    while(ch<=9&&ch>=0){x=x*10+ch-0;ch=getchar();}    return x*f;}int find(int x){    for(int i=1;i<=m;i++)     if(!vis[i]&&map[x][i])     {         vis[i]=true;         if(girl[i]==-1||find(girl[i]))//这个地方他不能是0,因为原来存的就是0与1          {             girl[i]=x;             return 1;         }     }     return 0;}int main(){    while(1)    {        ans=0;        memset(girl,-1,sizeof(girl));        memset(map,0,sizeof(map));         memset(map,0,sizeof(map));        n=read();if(!n) break;        m=read();        for(int i=1;i<=n;i++)         for(int j=1;j<=m;j++)          map[i][j]=read();        for(int i=1;i<=n;i++)        {            memset(vis,0,sizeof(vis));            if(find(i)) ans++;        }        printf("%d\n",ans);    }    return 0;}

 

HDU——2119 Matrix