匈牙利算法(二)

简介: AcWing 861. 二分图的最大匹配

二、AcWing 861. 二分图的最大匹配

本题链接:AcWing 861. 二分图的最大匹配

本博客给出本题截图:

image.png

image.png

本题分析

注意本题是无向图,但是根据我们上述的对匈牙利算法实现的讲解中可以看出来,其实我们只需要当成有向图去做就好了,即当成男追女,而不是双向奔赴.

match数组代表的含义就是找对象,match[i] = j;的意思就是女朋友i的男朋友为j,match[j] == 0意味着没有男朋友

st数组的含义是是否被选定了,st[i] == false意味着i这个女嘉宾没有被其他男嘉宾选定

if (match[j] == 0 || find(match[j]))
{
  match[j] = x;
  return true;
}

这里的意思是如果j号女嘉宾没有男嘉宾,或者j号女嘉宾现在的对象有备胎,那么就让j号女嘉宾成为x号男嘉宾的对象

for (int i = 1; i <= n1; i ++ )
{
  memset(st, false, sizeof st);
  if (find(i)) res ++ ;
}

每一个男嘉宾开始寻找女嘉宾的时候,都是默认女嘉宾没有对象的,因为有对象就抢

AC代码

#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 510, M = 100010;
int n1, n2, m;
int h[N], e[M], ne[M], idx;
int match[N];
bool st[N];
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
bool find(int x)
{
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!st[j])
        {
            st[j] = true;
            if (match[j] == 0 || find(match[j]))
            {
                match[j] = x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    scanf("%d%d%d", &n1, &n2, &m);
    memset(h, -1, sizeof h);
    while (m -- )
    {
        int a, b;
        scanf("%d%d", &a, &b);
        add(a, b);
    }
    int res = 0;
    for (int i = 1; i <= n1; i ++ )
    {
        memset(st, false, sizeof st);
        if (find(i)) res ++ ;
    }
    printf("%d\n", res);
    return 0;
}

三、时间复杂度

关于匈牙利算法的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。


目录
相关文章
|
4月前
没有给出二分图两个左右点集时的二分图最大匹配
没有给出二分图两个左右点集时的二分图最大匹配
12 0
|
10天前
|
算法
二分图之最大匹配数算法(Kindergarten)
二分图之最大匹配数算法(Kindergarten)
|
28天前
|
算法 测试技术 C#
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
|
9月前
|
算法
算法提高:计算几何基础 | 详解凸包问题
点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上,或者在其内
90 0
算法提高:计算几何基础 | 详解凸包问题
|
6月前
|
算法 C++
单源最短路的建图
单源最短路的建图
29 0
|
9月前
|
存储 算法 调度
【喜闻乐见,包教包会】二分图最大匹配:匈牙利算法(洛谷P3386)
【喜闻乐见,包教包会】二分图最大匹配:匈牙利算法(洛谷P3386)
48 0
|
机器学习/深度学习 算法
模拟退火-n皇后问题
模拟退火-n皇后问题
|
算法
短小精悍的多源最短路径算法—Floyd算法
在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径。
355 0
短小精悍的多源最短路径算法—Floyd算法
|
算法
匈牙利算法(一)
复习acwing算法基础课的内容,本篇为讲解基础算法:匈牙利算法,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
86 0
匈牙利算法(一)
|
算法
最短路径算法
图的遍历算法(深度优先遍历,广度优先遍历)我们在之前文章已经讲过,今天我们一起来看一下最短路径算法。日常工作、学习常用的算法大部分已经更新到算法专栏中,欢迎大家关注我的算法专栏。
173 0