匈牙利算法解决二分图匹配问题
时间: 2025-05-26 22:51:13 浏览: 12
### 匈牙利算法解决二分图匹配问题
#### 背景介绍
匈牙利算法是一种用于寻找二分图的最大匹配的有效方法。它基于增广路径的概念来逐步增加当前匹配的数量,直到无法再找到新的增广路径为止[^2]。
#### 增广路径定义
在一个二分图中,如果一条路径使得起点和终点都是未匹配的点,并且路径上的边交替处于已匹配状态和未匹配状态,则该路径称为增广路径。通过反转这条路径上所有边的状态(即将匹配变为未匹配,反之亦然),可以得到一个新的更大的匹配集[^3]。
#### Python代码实现详解
以下是利用Python实现匈牙利算法的一个具体例子:
```python
def Matching(u, used, B, Graph):
for i in range(1, len(Graph[u])):
if Graph[u][i] == 1 and not used[i]:
used[i] = True
if B[i] == 0 or Matching(B[i], used, B, Graph):
B[i] = u
return True
return False
while True:
try:
k, n, m = map(int, input("请输入三个数以逗号隔开,分别代表边的个数、A集合元素个数、B集合元素个数:").split(","))
Graph = [[0 for _ in range(m + 1)] for __ in range(n + 1)]
print("请输入k行,每行两个整数以逗号隔开,表示一条边")
for _ in range(k):
a, b = map(int, input().split(","))
Graph[a][b] = 1
B = [0] * (m + 1)
ans = 0
for i in range(1, n + 1):
used = [False] * (m + 1)
if Matching(i, used, B, Graph):
ans += 1
print(f"最大匹配是:{ans}")
except Exception as e:
break
```
这段代码实现了基本的匈牙利算法逻辑,其中`Matching`函数负责查找是否存在增广路径并更新匹配关系;外部循环则遍历所有的可能起始节点尝试扩展匹配数量[^2]。
#### 步骤解析
- 初始化数据结构:创建邻接矩阵Graph以及记录右侧顶点匹配情况的一维数组B。
- 对于每一个左侧集合中的顶点执行DFS/BFS搜索操作试图发现新的可扩展示意子序列即所谓的“增广路”。
- 如果成功找到了这样的路径,则调整现有的配对方案使之容纳新加入的关系;否则继续处理下一个候选者直至全部考察完毕。
#### 示例应用
假设有如下输入:
```
请输入三个数以逗号隔开,分别代表边的个数、A集合元素个数、B集合元素个数:4,3,3
请输入k行,每行两个整数以逗号隔开,表示一条边
1,1
1,2
2,2
3,3
```
程序会输出:
```
最大匹配是:3
```
这表明在这个特定的例子中有三条独立边能够形成完美匹配[^2]。
阅读全文
相关推荐


















