用途
- 求二分图的最大匹配
- 求二分图最小点覆盖集(=最大匹配数)
- 求二分图最小边覆盖集(=n-最大匹配数)
模板
int a[maxn][maxn];///二分图中左右点集之间的关系
bool vis[maxn];///当前左点访问过的右点
int match[maxn];///右点已匹配的左点
int dfs(int x)///匹配当前左点
{
for(int i=1,i<=n;i++)///遍历所有右点
{
if(a[x][i]&&!vis[i])///如果有关系并且右点没有被访问过
{
vis[i]=1;
if(!match[i]||dfs(match[i]))///如果右点没有被匹配过或当前匹配该右点的左点还可以匹配其他右点
{
match[i]=x;
return 1;
}
}
}
return 0;
}
///需要注意,vis数组需要在每次匹配前清空
///时间复杂度O(n^3)