二分图匹配--匈牙利算法

匈牙利算法

求二分图的最大匹配,也就是求最多有多少对\((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

参考博客

https://blog.csdn.net/lw277232240/article/details/72615522

posted @ 2019-11-12 10:52  hezongdnf  阅读(151)  评论(0编辑  收藏  举报