匈牙利算法(二)

简介: 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
|
算法 UED 索引
Nmslib高维空间最近邻逼近搜索算法介绍
业务场景 上一次介绍图像搜索的基本原理,现在记录下使用的数据包的问题。查询图片先进行特征提取,使用一个向量来表示,之后使用该向量与数据库中所有的商品向量进行计算相似度指标,比如cos距离,欧式距离,汉明距离。
5998 0
|
15天前
|
算法
二分图之最大匹配数算法(Kindergarten)
二分图之最大匹配数算法(Kindergarten)
|
1月前
|
算法 测试技术 C#
【二分图】【二分图最大匹配】LCP 04. 覆盖
【二分图】【二分图最大匹配】LCP 04. 覆盖
|
9月前
|
算法
算法提高:计算几何基础 | 详解凸包问题
点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上,或者在其内
90 0
算法提高:计算几何基础 | 详解凸包问题
|
6月前
|
算法 C++
单源最短路的建图
单源最短路的建图
30 0
|
9月前
|
存储 算法 调度
【喜闻乐见,包教包会】二分图最大匹配:匈牙利算法(洛谷P3386)
【喜闻乐见,包教包会】二分图最大匹配:匈牙利算法(洛谷P3386)
48 0
|
算法 固态存储
【双目视觉】 立体匹配算法原理之“代价函数”
Census方法任取左图一个像素点P,观察周围3*3窗口的像素点灰度值,如果小于P就置1,否则为0,然后编码。右图也是如此。最后异或比较,根据异或后的结果,看‘1’的个数,计算汉明距离
134 0
|
机器学习/深度学习 算法
模拟退火-n皇后问题
模拟退火-n皇后问题
求解幂集问题(蛮力法)
求解幂集问题(蛮力法)
169 0