📜  DAA |最大二分匹配(1)

📅  最后修改于: 2023-12-03 14:40:35.876000             🧑  作者: Mango

DAA | 最大二分匹配

简介

最大二分匹配是一种常见的图论问题,旨在寻找一个由左右两侧节点组成的二分图中所有可以匹配的节点的最大数量。

算法实现

最大二分匹配算法可以通过增广路法进行解决。

增广路法

增广路法是寻找最大匹配的经典算法,其流程如下:

  1. 对二分图中的左侧节点进行遍历,对于每个节点,如果其未匹配,则对其进行深度优先搜索,寻找增广路;

  2. 对于当前未匹配的左侧节点,如果其找到了一条增广路,则将其与对应的右侧节点匹配,并继续寻找增广路;反之,如果当前节点无法找到增广路,则跳过该节点;

  3. 重复以上步骤,直到所有的节点都被匹配。

实现步骤
  1. 遍历二分图中的左侧节点;

  2. 对于每个未匹配节点,进行深度优先搜索,寻找增广路;

  3. 如果当前节点找到了增广路,则将其与对应的右侧节点匹配,并继续寻找增广路;

  4. 重复前三步,直到所有的节点都被匹配。

代码实现
def dfs(u):
    for v in range(n):
        if not vis[v] and g[u][v]:
            vis[v] = True
            if match[v] == -1 or dfs(match[v]):
                match[v] = u
                return True
    return False

def max_match():
    ans = 0
    for i in range(m):
        vis = [False] * n
        if dfs(i):
            ans += 1
    return ans

# m 为左侧节点数量,n 为右侧节点数量,g 为二分图的邻接矩阵
m, n = len(g), len(g[0])
match = [-1] * n
for i in range(m):
    vis = [False] * n
    dfs(i)
print(max_match()) 
参考资料