hdu2119 Matrix

来源:互联网 发布:巨灵数据库 编辑:程序博客网 时间:2024/06/05 10:03

由题意可知,这其实就是让求最小覆盖点;

二分图中,选取最少的点数,使这些点和所有的边都有关联(把所有的边的覆盖),叫做最小点覆盖。

可知 、最小点覆盖数 = 最大匹配数(证明略,自行百度);则按照求最大匹配数的模板来就可以了;

#include<stdio.h>#include<stdlib.h>#include<string.h>int n,m;int used[110],link[110],mat[110][110];int dfs(int t){    int i;    for(i=1;i<=m;i++)    {        if(used[i]==0&&mat[t][i])        {            used[i]=1;            if(link[i]==-1||dfs(link[i]))            {                link[i]=t;                return 1;            }        }    }    return 0;}int main(){    int i,j;    while(scanf("%d",&n),n!=0)    {        scanf("%d",&m);        memset(link,-1,sizeof(link));        memset(mat,0,sizeof(mat));        for(i=1; i<=n; i++)            for(j=1; j<=m; j++)                scanf("%d",&mat[i][j]);        int num=0;        for(i=1;i<=n;i++)        {            memset(used,0,sizeof(used));            if(dfs(i))                num++;        }        printf("%d\n",num);    }    return 0;}


0 0
原创粉丝点击