max_weight_matching#

max_weight_matching(G, maxcardinality=False, weight='weight')[source]#

计算图 G 的最大权重匹配。

匹配是边的一个子集,其中没有节点出现多次。匹配的权重是其边权重的总和。极大匹配(maximal matching)是无法再添加更多边而仍然保持匹配状态的匹配。匹配的势(cardinality)是匹配边的数量。

参数:
GNetworkX 图

无向图

maxcardinality: bool, 可选 (默认值=False)

如果 maxcardinality 为 True,则计算在所有最大势匹配中权重最大的匹配。

weight: string, 可选 (默认值=’weight’)

对应于边权重的边数据键。如果找不到该键,则使用 1 作为权重。

返回:
matching集合

图的一个极大匹配。

注意

如果 G 的边具有权重属性,则使用边数据作为权重值,否则权重假定为 1。

此函数的时间复杂度为 O(节点数 ** 3)。

如果所有边权重都是整数,算法仅使用整数计算。如果使用浮点权重,由于数值精度误差,算法可能返回略微次优的匹配。

此方法基于用于查找增广路径的“开花”(blossom)方法和用于查找最大权重匹配的“原始-对偶”(primal-dual)方法,这两种方法均由 Jack Edmonds 发明 [1]

也可以使用 networkx.algorithms.bipartite.matching 中提供的函数对二分图进行匹配。

参考资料

[1]

“Efficient Algorithms for Finding Maximum Matching in Graphs”, Zvi Galil, ACM Computing Surveys, 1986.

示例

>>> G = nx.Graph()
>>> edges = [(1, 2, 6), (1, 3, 2), (2, 3, 1), (2, 4, 7), (3, 5, 9), (4, 5, 3)]
>>> G.add_weighted_edges_from(edges)
>>> sorted(nx.max_weight_matching(G))
[(2, 4), (5, 3)]