本博客写作思路和代码来自知乎-算法学习笔记5
匈牙利算法
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。
匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法
简单来讲就是求二分图最大匹配
int M,N;
const int maxn=1e3+5;
int Map[maxn][maxn];
int p[maxn];//记录当前一侧对应的另一侧节点
bool vis[maxn];//vis数组做标记
bool match(int i)
{
for(int j=1;j<=N;j++)
if(Map[i][j]&&!vis[i][j])//如果有其他选择 并且这个选择
{ //还没被选择过
vis[j]=true; //选择ta
if(p[j]==0||match(p[j]))
{
p[j]=i;
return true;
}
}
return false;
}
int Hungarian()
{
int cnt=0;
for(int i=1;i<=M;i++)
{
memset(vis,0,sizeof(vis));//每一步都要初始化
if(match(i))
cnt++;
}
return cnt;
}