在一个图中,每条边都有给定的流量容量,计算两个顶点之间的最大流量。
值
一个具有以下组件的命名列表
- value
一个数值标量,最大流量的值。
- flow
一个数值向量,流量本身,每条边对应一个条目。对于无向图,这个条目有点棘手,因为对于这些图,流量方向不是由边的方向预先确定的。对于这些图,这个向量的元素可以是负数,这意味着流量从较大的顶点ID流向较小的顶点ID。正值表示流量从较小的顶点ID流向较大的顶点ID。
- cut
一个数值向量,包含边ID,对应于最大流量的最小割。
- partition1
一个数值向量,包含顶点ID,表示对应于最大流量的最小割的第一个分区中的顶点。
- partition2
一个数值向量,包含顶点ID,表示对应于最大流量的最小割的第二个分区中的顶点。
- stats
一个列表,包含来自推送-重标记算法的一些统计信息。目前有五个整数值:
nopush
是推送操作的次数,norelabel
是重标记的次数,nogap
是使用间隙启发式算法的次数,nogapnodes
是由于间隙启发式算法而省略的总间隙节点数,nobfs
是执行全局广度优先搜索更新的次数,以便为顶点分配更好的高度(=距离)值。
详细信息
max_flow()
计算加权(即有值的)图中两个顶点之间的最大流量。从source
到target
的流量是将非负实数分配给图的边,满足两个属性:(1)对于每条边,流量(即分配的数字)不大于边的容量(capacity
参数或边属性),(2)对于每个顶点,除了源顶点和目标顶点之外,流入的流量与流出的流量相同。流量的值是target
顶点的流入流量。最大流量是最大值的流量。
参考文献
A. V. Goldberg 和 R. E. Tarjan: A New Approach to the Maximum Flow Problem Journal of the ACM 35:921-940, 1988.
参见
其他流量: dominator_tree()
, edge_connectivity()
, is_min_separator()
, is_separator()
, min_cut()
, min_separators()
, min_st_separators()
, st_cuts()
, st_min_cuts()
, vertex_connectivity()
示例
E <- rbind(c(1, 3, 3), c(3, 4, 1), c(4, 2, 2), c(1, 5, 1), c(5, 6, 2), c(6, 2, 10))
colnames(E) <- c("from", "to", "capacity")
g1 <- graph_from_data_frame(as.data.frame(E))
max_flow(g1, source = V(g1)["1"], target = V(g1)["2"])
#> $value
#> [1] 2
#>
#> $flow
#> [1] 1 1 1 1 1 1
#>
#> $cut
#> + 2/6 edges from 97f813a (vertex names):
#> [1] 3->4 1->5
#>
#> $partition1
#> + 2/6 vertices, named, from 97f813a:
#> [1] 1 3
#>
#> $partition2
#> + 4/6 vertices, named, from 97f813a:
#> [1] 4 5 6 2
#>
#> $stats
#> $stats$nopush
#> [1] 4
#>
#> $stats$norelabel
#> [1] 1
#>
#> $stats$nogap
#> [1] 0
#>
#> $stats$nogapnodes
#> [1] 0
#>
#> $stats$nobfs
#> [1] 1
#>
#>