码迷,mamicode.com
首页 > 其他好文 > 详细

HDU——2119 Matrix

时间:2017-07-01 22:36:35      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:div   ios   getc   地方   size   mem   style   font   return   

技术分享

   技术分享

题目大意:

给你一个矩阵(只包含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

标签:div   ios   getc   地方   size   mem   style   font   return   

原文地址:http://www.cnblogs.com/z360/p/7103600.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!