匈牙利算法(二)

简介: 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;
}

三、时间复杂度

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


目录
相关文章
|
6月前
没有给出二分图两个左右点集时的二分图最大匹配
没有给出二分图两个左右点集时的二分图最大匹配
31 0
|
6月前
|
算法
二分图之最大匹配数算法(Kindergarten)
二分图之最大匹配数算法(Kindergarten)
|
算法
算法提高:计算几何基础 | 详解凸包问题
点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上,或者在其内
178 0
算法提高:计算几何基础 | 详解凸包问题
|
存储 算法 调度
【喜闻乐见,包教包会】二分图最大匹配:匈牙利算法(洛谷P3386)
【喜闻乐见,包教包会】二分图最大匹配:匈牙利算法(洛谷P3386)
83 0
|
算法 Java C++
蓝桥杯 算法训练 小生物的逃逸(球坐标公式+暴力求解)
蓝桥杯 算法训练 小生物的逃逸(球坐标公式+暴力求解)
|
机器学习/深度学习 算法
模拟退火-n皇后问题
模拟退火-n皇后问题
|
算法
匈牙利算法(一)
复习acwing算法基础课的内容,本篇为讲解基础算法:匈牙利算法,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。
113 0
匈牙利算法(一)
|
机器学习/深度学习 索引 Python
使用遗传算法解决N皇后问题
经典的N皇后问题起源于国际象棋。任务是将八名皇后放置在棋盘上,而且他们中的任何两个都不互相构成威胁。换句话说,没有两个皇后可以在同一行、同一列或同一对角线。本文使用遗传算法解决N皇后问题。
1543 0
使用遗传算法解决N皇后问题
|
机器学习/深度学习 人工智能 算法
|
算法 Python
趣写算法系列之--匈牙利算法
通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能对多名异性有好感(惊讶-_-||暂时不考虑特殊的性取向),如果一对男女互有好感,那么你就可以把这一对撮合在一起,现在让我们无视掉所有的单相思(感觉快哭了),你拥有的大概就是下面这样一张关系图,每一条连线都表示互有好感。
4544 0
下一篇
无影云桌面