二分匹配_HDU_2119

来源:互联网 发布:mactype mac字体 编辑:程序博客网 时间:2024/05/01 18:05

一个矩阵,由01组成,任意删除行和列,最少删几次
最小点覆盖:可以引申为覆盖点,删掉边,边上两点就是行列

#include<iostream>#include<cstdio>#include<cstring>const int maxn = 105;using namespace std;int n,m;struct node{    int v,next;};node e[maxn*100];int head[maxn], tot;int link[maxn],vis[maxn];void init(){    tot=0;    memset(head, -1, sizeof(head));}void add(int u, int v){    e[tot].v = v;    e[tot].next = head[u];    head[u]=tot++;}int Find(int x){    for(int i = head[x]; i != -1; i = e[i].next)    {        int v = e[i].v;        if(!vis[v])        {            vis[v] = 1;            if(link[v] == -1 || Find(link[v]))            {                link[v] = x;                return 1;            }        }    }    return 0;}int math(){    int cnt = 0;    memset(link, -1, sizeof(link));    for(int i = 1; i <= n; i++)    {        memset(vis, 0, sizeof(vis));        if(Find(i))            cnt++;    }    return cnt;}int main(){    int x;    while(scanf("%d",&n) != EOF)    {        if(n == 0)break;        scanf("%d",&m);        init();        for(int i = 1;  i<= n; i++)            for(int j = 1; j <= m; j++)            {                scanf("%d",&x);                if(x)                    add(i,j);            }        printf("%d\n",math());    }    return 0;}
0 0
原创粉丝点击