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;
}