匈牙利算法
求二分图的最大匹配,也就是求最多有多少对\((x,y)\)匹配,时间复杂度\(O(n^2)\)
算法思想
对于每一个x,寻找一个y匹配,如果找到的y匹配已经有匹配了,给y的匹配换一个y(有点绕)
模板
int n,m,e;
int a[maxn][maxn];
bool vis[maxn]; //y是否访问过
int match[maxn]; //y的匹配x
int find(int x) //给x找匹配y
{
for(int y = 1; y <= m; y++)
{
if(!vis[y] && a[x][y]) //如果没有访问过y,并且x和y有匹配
{
vis[y] = 1;
if(match[y] == -1 || find(match[y])) //如果y没有匹配,或者y的匹配可以换另一个y
{
match[y] = x;
return 1;
}
}
}
return 0;
}
//mian函数里面
mem(match,-1);
int ans = 0; //最大匹配数
for(int i = 1; i <= n; i++)
{
mem(vis,0); //每次初始化为0
ans += find(i);
}
模板题
https://www.luogu.com.cn/problem/P3386