python最长匹配_python 实现匈牙利算法求解二分图最大匹配

本文介绍了使用Python实现匈牙利算法来寻找二分图的最大匹配。通过深度搜索寻找增广路径,并在找到路径后进行边的匹配状态取反,从而逐步增加匹配数,直至达到最大匹配。提供的代码示例展示了如何构建特殊邻接表并执行深度搜索。
摘要由CSDN通过智能技术生成

​重点:理解增广路和取反

1. 匈牙利算法

求解目标:找到二分图的最大匹配

整体思路:每一步寻找一条增广路径,取反

2. 关键步骤

二分图的顶点分为左边点集X和右边点集Y,假定遍历的点集是X。对于每一次迭代的点x_i,

搜索增广路径:遍历x_i的邻接节点y_j

如果y_j未匹配,则找到增广路

如果y_j已匹配,则寻找y_j的匹配节点的增广路径(深搜或者广搜)

取反:把增广路径中的已经匹配边改成未匹配;未匹配的改成匹配

3. python代码

​算法输入为字典形式的特殊邻接表。特殊之处在于字典的键和值的顶点分别属于二分图的左右点集合。

​深度搜索增广路径函数的参数中的visited_set的作用是避免重复访问。

# 匈牙利算法(dfs)

class Hungarian:

def search_extend_path(self, l_node, adjoin_map, l_match, r_match, visited_set):

'''深度搜索增广路径'''

for r_node in adjoin_map[l_node]: # 邻接节点

if r_node not in r_match.keys(): # 情况1: 未匹配, 则找到增广路径,取反

l_match[l_node] = r_node

r_match[r_node] = l_node

return True

else: # 情况2: 已匹配

next_l_node =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值