今天来讲个烧脑的图论算法——匈牙利算法。
基础概念
易得完备匹配一定是最大匹配,但反之不然。
匈牙利算法的一个例子
数学描述
算法代码
int w[202][202],cx[202],cy[202],nx,ny;
bool visit[202];
bool dfs(int u)
{
for(int i=1;i<=w[u][0];i++){
int v=w[u][i];
if(visit[v]==0){
visit[v]=1;
if(cy[v]==-1||dfs(cy[v])){
cx[u]=v;cy[v]=u;
return true;
}
}
}
return false;
}
int maxmatch()
{
int ans=0; // 最大匹配的数量
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
for(int i=1;i<=nx;i++){
if(cx[i]==-1){
memset(visit,0,sizeof(visit));
ans+=dfs(i);
}
}
return ans;
}
如有错误,欢迎指正。
参考:王树禾《图论》第二版