跳到内容

图中的匹配是指选择一组边,这些边是成对不相邻的,即它们没有共同的入射顶点。如果一个匹配不是任何其他匹配的真子集,则该匹配是最大匹配。

用法

is_matching(graph, matching, types = NULL)

is_max_matching(graph, matching, types = NULL)

max_bipartite_match(
  graph,
  types = NULL,
  weights = NULL,
  eps = .Machine$double.eps
)

参数

graph

输入的图。它可能是定向的,但边的方向将被忽略。

matching

一个潜在的匹配。一个整数向量,给出每个顶点的匹配对。对于没有配对的顶点,请在此处提供NA

types

顶点类型,如果图是二分图。默认情况下,它们从“type”顶点属性中获取(如果存在)。

weights

潜在的边权重。如果图有一个名为“weight”的边属性,并且此参数为NULL,则自动使用该边属性。在加权匹配中,边的权重必须尽可能匹配。

eps

在加权二分匹配算法中用于相等性测试的一个小实数。如果两个实数之间的差小于eps,则在该算法中认为它们相等。这是避免数值误差累积所必需的。默认情况下,它设置为最小的\(x\),使得\(1+x \ne 1\)成立。如果你在没有权重的情况下运行算法,则此参数将被忽略。

is_matching()is_max_matching()返回一个逻辑标量。

max_bipartite_match()返回一个带有以下组件的列表

matching_size

匹配的大小,即连接匹配顶点的边的数量。

matching_weight

匹配的权重,如果图是加权的。对于未加权图,这与匹配的大小相同。

matching

匹配本身。数字顶点 ID,或者如果图已命名,则为顶点名称。未匹配的顶点用NA表示。

详细信息

is_matching()检查一个匹配向量,并验证其长度是否与给定图中顶点的数量匹配,其值是否介于零(含)和顶点数量(含)之间,以及对于每个匹配的顶点对,图中是否存在相应的边。对于二分图,它还验证匹配的顶点是否位于图的不同部分。

is_max_matching()检查一个匹配是否是最大匹配。当且仅当图中没有未匹配的顶点,并且其邻居之一也是未匹配的顶点时,匹配才是最大匹配。

max_bipartite_match()计算二分图中的最大匹配。二分图中的匹配是将第一类顶点部分分配给第二类顶点,使得第一类的每个顶点最多匹配第二类的一个顶点,反之亦然,并且匹配的顶点必须由图中的边连接。匹配的大小(或基数)是边的数量。如果不存在具有更大基数的其他匹配,则匹配是最大匹配。对于加权图,最大匹配是其边的权重在所有可能的匹配中具有最大总权重的匹配。

二分图中的最大匹配是通过 push-relabel 算法找到的,该算法具有贪婪初始化,并在每\(n/2\)步之后进行全局重新标记,其中\(n\)是图中顶点的数量。

作者

Tamas Nepusz ntamas@gmail.com

示例

g <- graph_from_literal(a - b - c - d - e - f)
m1 <- c("b", "a", "d", "c", "f", "e") # maximal matching
m2 <- c("b", "a", "d", "c", NA, NA) # non-maximal matching
m3 <- c("b", "c", "d", "c", NA, NA) # not a matching
is_matching(g, m1)
#> [1] TRUE
is_matching(g, m2)
#> [1] TRUE
is_matching(g, m3)
#> [1] FALSE
is_max_matching(g, m1)
#> [1] TRUE
is_max_matching(g, m2)
#> [1] FALSE
is_max_matching(g, m3)
#> [1] FALSE

V(g)$type <- rep(c(FALSE, TRUE), 3)
print_all(g, v = TRUE)
#> IGRAPH 8e09ce2 UN-B 6 5 -- 
#> + attr: name (v/c), type (v/l)
#> + vertex attributes:
#> |     name  type
#> | [1]    a FALSE
#> | [2]    b  TRUE
#> | [3]    c FALSE
#> | [4]    d  TRUE
#> | [5]    e FALSE
#> | [6]    f  TRUE
#> + edges from 8e09ce2 (vertex names):
#> [1] a--b b--c c--d d--e e--f
max_bipartite_match(g)
#> $matching_size
#> [1] 3
#> 
#> $matching_weight
#> [1] 3
#> 
#> $matching
#>   a   b   c   d   e   f 
#> "b" "a" "d" "c" "f" "e" 
#> 

g2 <- graph_from_literal(a - b - c - d - e - f - g)
V(g2)$type <- rep(c(FALSE, TRUE), length.out = vcount(g2))
print_all(g2, v = TRUE)
#> IGRAPH 3dab7ef UN-B 7 6 -- 
#> + attr: name (v/c), type (v/l)
#> + vertex attributes:
#> |     name  type
#> | [1]    a FALSE
#> | [2]    b  TRUE
#> | [3]    c FALSE
#> | [4]    d  TRUE
#> | [5]    e FALSE
#> | [6]    f  TRUE
#> | [7]    g FALSE
#> + edges from 3dab7ef (vertex names):
#> [1] a--b b--c c--d d--e e--f f--g
max_bipartite_match(g2)
#> $matching_size
#> [1] 3
#> 
#> $matching_weight
#> [1] 3
#> 
#> $matching
#>   a   b   c   d   e   f   g 
#> "b" "a" "d" "c" "f" "e"  NA 
#> 
#' @keywords graphs