跳到内容

在一个图中,每条边都有给定的流量容量,计算两个顶点之间的最大流量。

用法

max_flow(graph, source, target, capacity = NULL)

参数

graph

输入图。

source

源顶点的ID。

target

目标顶点(有时也称为汇点)的ID。

capacity

给出边容量的向量。如果这是NULL(默认值),则使用capacity边属性。请注意,此函数不使用weight边属性。

一个具有以下组件的命名列表

value

一个数值标量,最大流量的值。

flow

一个数值向量,流量本身,每条边对应一个条目。对于无向图,这个条目有点棘手,因为对于这些图,流量方向不是由边的方向预先确定的。对于这些图,这个向量的元素可以是负数,这意味着流量从较大的顶点ID流向较小的顶点ID。正值表示流量从较小的顶点ID流向较大的顶点ID。

cut

一个数值向量,包含边ID,对应于最大流量的最小割。

partition1

一个数值向量,包含顶点ID,表示对应于最大流量的最小割的第一个分区中的顶点。

partition2

一个数值向量,包含顶点ID,表示对应于最大流量的最小割的第二个分区中的顶点。

stats

一个列表,包含来自推送-重标记算法的一些统计信息。目前有五个整数值:nopush是推送操作的次数,norelabel是重标记的次数,nogap是使用间隙启发式算法的次数,nogapnodes是由于间隙启发式算法而省略的总间隙节点数,nobfs是执行全局广度优先搜索更新的次数,以便为顶点分配更好的高度(=距离)值。

详细信息

max_flow()计算加权(即有值的)图中两个顶点之间的最大流量。从sourcetarget的流量是将非负实数分配给图的边,满足两个属性:(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.

maxflow().

示例


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
#> 
#>