匈牙利算法

给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数

摘自:

https://www.luogu.org/blog/fusu2333/post-2018-wu-yi-qing-bei-pei-xun-er-fen-tu-xiong-ya-li-suan-fa-post

二分图:一群汉子和一群妹子匹配。没有基友也没百合,不能开后宫,这就是二分图。最大匹配就是求能组成的CP最多多少对
建立有向图G,分为二分图的左侧和右侧。
优先选择左侧序号更小的连接可能的边。
对于两个点的目标点“冲突”的时候,采取“协商”的办法。
即序号小的连接可能连接的另一条边。
若“协商”失败,则放弃序号较大的点的边。


不难发现,匈牙利算法就是一个绿与被绿协商与匹配的过程

上代码:

bool dfs(int x){
For(y,1,m){
if(lk[x][y]&&!vis[y]){
vis[y]=1;//对于每个男生来说,每dfs一次vis都会清空一次
if(!mat[y]){
mat[y]=x;
return true;
}else{
if(dfs(mat[y]){
mat[y]=x;
return true;
}}
return false;
}

For(i,1,n)
{me(vis,,0);
if(dfs(i))ans++;
}

 

posted @ 2018-08-03 01:29  planche  阅读(127)  评论(0编辑  收藏  举报