匈牙利算法
给定一个二分图,用匈牙利算法求这个二分图的最大匹配数。
二分图就是一个图里里面的顶点可以分为互不相交的两个子集,并且所有的边的两个顶点分别在这两个子集中。
求最大匹配,我们希望每个在左边的点都能找到右边的一个点和它匹配。我们依次枚举左边的点x的所有出边指向的点,若(x,y)是一对合法的匹配,我们将匹配数加一,否则我们试图给原来匹配y的x'重新找一个匹配,如果x'匹配成功,那么(x,y)就可以新增为一对合法的匹配。给x'寻找匹配的过程可以递归解决。
输入:n 全局变量,一侧的点数
g全局变量,g[i]表示与左边点i相连的右边的点
输出:最大匹配数
const int maxn=555;
const int n=100;
vector<int>g[maxn];
int from[maxn],tot;
bool use[maxn];
bool match(int x){
for(int i=0;i<g[x].size();i++)
{if(!use[g[x][i]]){
use[g[x][i]]=true;
if(from[g[x][i]]==-1||match(from[g[x][i]])){
from[g[x][i]]=x;
return true;
}
}
return false;
}
}
int hungry(){
fill(from,from+maxn,-1);
int ans=0;
for(int i=0;i<n;i++)
{memset(use,0,sizeof(use));
if(match(i))ans++;
}
return ans;
}