861. 二分图的最大匹配

摘要
Title: 861. 二分图的最大匹配
Tag: 匈牙利算法、二分图
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

861. 二分图的最大匹配

  • 题意

    给定一个二分图,其中左半部包含 n1 个点(编号 1∼n1),右半部包含 n2 个点(编号 1∼n2),二分图共包含 m 条边。
    数据保证任意一条边的两个端点都不可能在同一部分中。
    请你求出二分图的最大匹配数。

  • 思路

    二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。
    二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。

    匈牙利算法,实际运行远小于O(nm)O(n*m)

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    '''
    Author: NEFU AB-IN
    Date: 2022-03-04 22:36:48
    FilePath: \ACM\Acwing\861.py
    LastEditTime: 2022-03-05 11:27:14
    '''
    N = 510

    match, st = [0] * N, [0] * N # match 表示左边选择的右边点
    g = [[] for _ in range(N)]


    def find(u):
    for v in g[u]:
    if st[v] == 0:
    st[v] = 1
    if match[v] == 0 or find(match[v]): #如果右边未匹配,或者与右相连的左点有别的匹配
    match[v] = u
    return True
    return False


    n1, n2, m = map(int, input().split())
    res = 0

    for i in range(m):
    u, v = map(int, input().split())
    g[u].append(v)

    for i in range(1, n1 + 1):
    st = [0] * N # 每次清空st数组,表示右边目前都未考虑过,相当于回溯
    if find(i):
    res += 1
    print(res)
使用搜索:谷歌必应百度