HDU——2119 Matrix

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU——2119 Matrix相关的知识,希望对你有一定的参考价值。

技术分享

   技术分享

题目大意:

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

思路:

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

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

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 110
using 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的主要内容,如果未能解决你的问题,请参考以下文章

HDU——2119 Matrix

HDU——T 2119 Matrix

Hdu 2119 Matrix

HDU-2119-Matrix(最大匹配)

二分图匹配入门专题1D - Matrix hdu2119最小顶点覆盖

Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段