二分图匹配总结

二分图匹配

关键在于如何建图

哪些问题可以用二分图匹配:

  1. 题目中明确给出了两两关系,寻找满足关系最大组数。
  2. 题目没给出明确的关系,但可以寻找内在的关系建立二分图求解。

 

哪些关系可以建立二分图求解:

  1. 题目明确给出两组顶点以及之间的关系HDU - 1083
  2. 题目给出一组顶点以及之间的关系,且满足二分图的特性HDU - 2444
  3. 二维坐标轴中的行和列匹配 HDU - 1045
  4. 插入位置的匹配 HDU - 2819 HDU - 2389
  5. 连续位置之间的匹配 HDU - 4185 POJ - 3020
  6. 求最小顶点覆盖数 HDU - 1054
  7. 求最大独立集 HDU - 3829
  8. 求单向道路数 HDU - 1054 HDU - 1151
  9. 扩展为多重匹配的以上部分情况 POJ - 2289

 

注意技巧:

  1. 在只有一个顶点集合且满足二分图的特性时,可以把一个点分为两个顶点进行匹配,得到最大匹配数为原图的两倍。
  2. 二分图最大匹配数=最小点覆盖数
  3. 最大独立集=顶点数-最小点覆盖数
  4. 单向道路数=顶点数-最大匹配数
  5. 如果再求单向道路数时顶点可以重复走,可以用Floyd算法扩充道路。
二分图又称作二部图,是图论中的一种特殊模型。设$G=(V,E)$是一个无向图,如果顶点$V$可分割为两个互不相交的子集$(A,B)$,并且图中的每条边($i$,$j$)所关联的两个顶点$i$和$j$分别属于这两个不同的顶点集($i \in A$,$j \in B$),则称图$G$为一个二分图 [^2]。 二分图匹配有不同类型,二分图的带权匹配是求出一个匹配集合,使得集合中边的权值之和最大或最小;二分图的最佳匹配要求匹配必须为完备匹配,在此基础上,才要求匹配的边权值之和最大或最小,且二分图的带权匹配与最佳匹配不等价,也不互相包含 [^1]。 二分图匹配的相关算法方面,有求有向图最小路径覆盖的算法。对于有向图的最小路径覆盖,先拆点,将每个点分为两个点,左边是$1 - n$个点,右边是$1 - n$个点,然后每一条有向边对应左边的点指向右边的点,对此图求最大匹配,再用$n$减去最大匹配即可 [^3]。 另外,最优匹配建立在完美匹配的基础上(完美匹配即所有人都能匹配),如果不存在完美匹配,算法失效。当不存在完美匹配时,可以人为加上边权为$0$的点边,从而得到最优匹配,可使用 KM(Kuhn - Munkres)算法 [^4]。 ### 代码示例(匈牙利算法求二分图最大匹配) ```python def dfs(u, used, match, graph): for v in graph[u]: if not used[v]: used[v] = True if match[v] == -1 or dfs(match[v], used, match, graph): match[v] = u return True return False def hungarian(graph, n, m): match = [-1] * m res = 0 for i in range(n): used = [False] * m if dfs(i, used, match, graph): res += 1 return res # 示例图的邻接表表示 graph = [ [0, 1], [0, 2], [1, 2] ] n = len(graph) # 左边顶点数 m = 3 # 右边顶点数 print(hungarian(graph, n, m)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值