1. 二分图最大匹配算法概述
二分图最大匹配是图论中的一个经典问题,在实际应用中有着广泛的用途。简单来说,二分图是指顶点可以划分为两个不相交的集合,使得每条边的两个端点分别属于这两个集合。而匹配则是指一组没有公共顶点的边集合。
匈牙利算法是解决二分图最大匹配问题最常用的方法之一,其时间复杂度为O(VE),其中V是顶点数,E是边数。这个算法由匈牙利数学家Dénes Kőnig在1931年提出,因此得名匈牙利算法。
在实际应用中,二分图匹配可以解决许多实际问题,比如:
- 任务分配问题
- 婚姻匹配问题
- 课程安排问题
- 网络流量优化等
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 匈牙利算法原理详解
2.1 算法核心思想
匈牙利算法的核心思想是通过不断寻找增广路径来扩大当前的匹配。增广路径是指从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边...最后到达另一个未匹配点的路径。
算法的基本步骤如下:
- 初始化所有顶点为未匹配状态
- 对于左边的每一个未匹配顶点,尝试找到一条增广路径
- 如果找到增广路径,则反转路径上的边的匹配状态(匹配变非匹配,非匹配变匹配)
- 重复上述过程直到找不到更多的增广路径
2.2 算法实现细节
在代码实现中,我们通常使用深度优先搜索(DFS)来寻找增广路径。以下是关键变量的作用:
adj[maxn]:邻接表,存储二分图的边pre[maxm]:记录右边顶点匹配的左边顶点visit[maxm]:标记右边顶点是否在当前DFS中被访问过
算法的核心函数是Hungarian_findMatch,它尝试为左边的顶点u找到一个匹配。如果成功则返回true,否则返回false。
3. 代码实现与解析
3.1 基础框架实现
cpp复制#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
#define maxn 510
#define maxm 510
vector<int> adj[maxn]; // 邻接表存储
int pre[maxm]; // 匹配记录
bool visit[maxm]; // 访问标记
int n, m;
