二分图最小顶点覆盖 hdu1150

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;
}
    原文作者:B树
    原文地址: https://blog.csdn.net/aonaigayiximasi/article/details/50877681
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞