二分图判定
二分图最大匹配
匈牙利算法【增广路算法】
bool dfs(int x)
{
for (int y = 1; y <= n; y++)
if (e[x][y] && !vis[y]) //有边且未访问
{
vis[y] = 1; //记录状态为访问过
if (match[y] == 0 || dfs(match[y]))//如果暂无匹配,或者原来匹配的左侧元素可以找到新的匹配
{
match[y] = x; //当前左侧元素成为当前右侧元素的新匹配
return 1;//返回匹配成功
}
}
return 0;//循环结束,仍未找到匹配,返回匹配失败
}
int hungarian()//匈牙利算法
{
int ans = 0;
for (int i = 1; i <= n; i++)
{
memset(vis, 0, sizeof(vis)); //切记***重置vis数组
if (dfs(i))
ans++;
}
return ans;
}