二分图最小顶点覆盖 hdu1150

来源:互联网 发布:最好网络合理理财 编辑:程序博客网 时间:2024/06/04 20:11

http://acm.hdu.edu.cn/showproblem.php?pid=1150

在二分图中求最少的点,让每条边都至少和其中的一个点关联,这就是“二分图的最小顶点覆盖”。
最小顶点覆盖=最大匹配数

#include <iostream>#include <stdio.h>#include <cstring>using namespace std;const int MAXN=105;int m1,m2;int g[MAXN][MAXN];int used[MAXN];int linker[MAXN];int dfs(int u){    for(int v=1;v<m2;v++)    {        if(g[u][v]&&!used[v])        {used[v]=1;            if(linker[v]==-1||dfs(linker[v]))            {                linker[v]=u;                return true;            }        }    }    return false;}int hungary(int m1){    int res=0;    memset(linker,-1,sizeof(linker));    for(int u=1;u<m1;u++)    {        memset(used,0,sizeof(used));        if(dfs(u))res++;    }    return res;}int main(){int num; while(cin>>m1) {memset(g,0,sizeof(g));     if(m1==0)break;     cin>>m2>>num;     for(int i=0;i<num;i++)     {int v1,v2,n;         cin>>n>>v1>>v2;         g[v1][v2]=1;     }     cout<<hungary(m1)<<endl; }    return 0;}
0 0
原创粉丝点击