二分图最大匹配的匈牙利算法
字数 832 2025-11-04 11:59:17

二分图最大匹配的匈牙利算法

题目描述
给定一个二分图G=(X∪Y, E),其中X和Y是两个不相交的顶点集合,E是连接X和Y的边集。二分图最大匹配问题要求找到包含最多边的匹配M⊆E,使得M中任意两条边都不共享公共顶点。

解题过程

1. 基本概念理解

  • 匹配:边的集合,其中任意两条边没有公共顶点
  • 最大匹配:包含边数最多的匹配
  • 增广路径:从一个未匹配点出发,交替经过匹配边和非匹配边,最终到达另一个未匹配点的路径

2. 算法核心思想
匈牙利算法基于以下原理:一个匹配是最大匹配当且仅当图中不存在增广路径。算法通过不断寻找增广路径并"翻转"路径上的边(匹配边变非匹配边,非匹配边变匹配边)来增加匹配的大小。

3. 算法步骤详解

步骤1:初始化

  • 创建匹配数组match[],记录每个Y集合顶点匹配的X集合顶点(初始为-1)
  • 创建访问标记数组visited[],用于DFS过程中的顶点访问记录

步骤2:为每个X顶点寻找匹配

for 每个x∈X:
    重置visited数组为false
    如果能为x找到匹配,则匹配数加1

步骤3:DFS寻找增广路径

function dfs(x):
    for 每个与x相邻的y∈Y:
        if y未被访问:
            标记y为已访问
            if y未匹配 或 与y匹配的x'可以找到新匹配:
                将y匹配给x
                返回true
    返回false

4. 具体执行过程

以二分图为例:
X = {A, B, C}, Y = {D, E, F}
边:A-D, A-E, B-D, B-F, C-E, C-F

迭代1:为A寻找匹配

  • 从A开始DFS,尝试匹配D(未匹配),成功匹配A-D

迭代2:为B寻找匹配

  • 从B开始,尝试匹配D(已匹配A)
  • 检查A是否可以换匹配:A尝试匹配E(未匹配),成功
  • 更新匹配:B-D, A-E

迭代3:为C寻找匹配

  • 从C开始,尝试匹配E(已匹配A)
  • 检查A是否可以换匹配:A尝试匹配D(已匹配B)
  • 检查B是否可以换匹配:B尝试匹配F(未匹配),成功
  • 更新匹配:C-E, A-D, B-F

5. 算法复杂度分析

  • 时间复杂度:O(|X|×|E|)
  • 空间复杂度:O(|X|+|Y|+|E|)

6. 关键点说明

  • 增广路径的长度总是奇数
  • 每次找到增广路径,匹配数增加1
  • 算法保证在有限步内找到最大匹配
  • 对于稠密图,可以使用BFS优化寻找增广路径的过程
二分图最大匹配的匈牙利算法 题目描述 给定一个二分图G=(X∪Y, E),其中X和Y是两个不相交的顶点集合,E是连接X和Y的边集。二分图最大匹配问题要求找到包含最多边的匹配M⊆E,使得M中任意两条边都不共享公共顶点。 解题过程 1. 基本概念理解 匹配:边的集合,其中任意两条边没有公共顶点 最大匹配:包含边数最多的匹配 增广路径:从一个未匹配点出发,交替经过匹配边和非匹配边,最终到达另一个未匹配点的路径 2. 算法核心思想 匈牙利算法基于以下原理:一个匹配是最大匹配当且仅当图中不存在增广路径。算法通过不断寻找增广路径并"翻转"路径上的边(匹配边变非匹配边,非匹配边变匹配边)来增加匹配的大小。 3. 算法步骤详解 步骤1:初始化 创建匹配数组match[ ],记录每个Y集合顶点匹配的X集合顶点(初始为-1) 创建访问标记数组visited[ ],用于DFS过程中的顶点访问记录 步骤2:为每个X顶点寻找匹配 步骤3:DFS寻找增广路径 4. 具体执行过程 以二分图为例: X = {A, B, C}, Y = {D, E, F} 边:A-D, A-E, B-D, B-F, C-E, C-F 迭代1:为A寻找匹配 从A开始DFS,尝试匹配D(未匹配),成功匹配A-D 迭代2:为B寻找匹配 从B开始,尝试匹配D(已匹配A) 检查A是否可以换匹配:A尝试匹配E(未匹配),成功 更新匹配:B-D, A-E 迭代3:为C寻找匹配 从C开始,尝试匹配E(已匹配A) 检查A是否可以换匹配:A尝试匹配D(已匹配B) 检查B是否可以换匹配:B尝试匹配F(未匹配),成功 更新匹配:C-E, A-D, B-F 5. 算法复杂度分析 时间复杂度:O(|X|×|E|) 空间复杂度:O(|X|+|Y|+|E|) 6. 关键点说明 增广路径的长度总是奇数 每次找到增广路径,匹配数增加1 算法保证在有限步内找到最大匹配 对于稠密图,可以使用BFS优化寻找增广路径的过程