匈牙利算法
给定一个二分图,结点个数分别为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++; }