igraph的gomory_hu_tree是否计算出最小砍伐树?

时间:2014-08-14 08:36:00

标签: python algorithm graph tree igraph

我正在尝试使用python-igraph实现this graph clustering algorithm (sec. 3.2)。由于我不想自己计算最小割树,我正在尝试使用gomory_hu_tree()方法。为了解决这个问题(并提供一个MWE),我写了以下内容:

from igraph import *

g= Graph()

g.add_vertices(4)

g.vs["name"] = ["0", "1", "2", "artificial"]

g.add_edge("0", "1", weight=10.0)
g.add_edge("0", "2", weight=20.0)
g.add_edge("2", "1", weight=30.0)
g.add_edge("artificial", "0", weight=100.0)
g.add_edge("artificial", "1", weight=100.0)
g.add_edge("artificial", "2", weight=100.0)

t = g.gomory_hu_tree(capacity="weight")
print t.es["flow"]
print
print t

我得到以下输出:

[130.0, 140.0, 150.0]

IGRAPH UNW- 4 3 --
+ attr: name (v), flow (e), weight (e)
+ edges (vertex names):
0--1, 1--2, 2--artificial

但这不是最小砍树!如果树是这样的,那么删除12之间的边缘会产生图表分为两个子集{0, 1}{2, t}的代价但是,正确的答案是削减{1}{2, 0, t},费用仅为140.

(“成本”是指各自削减的价值。)

因此,最小切割树的一个(也是唯一的)正确答案是

0--artificial, 1--artificial, 2--artificial

我出错了什么?在这种情况下使用gomory_hu_tree()方法可能是错误的吗?

注意:我最初是asked this question in a completely wrong way

1 个答案:

答案 0 :(得分:1)

以下是几个定义:

1)树被称为流等效树当且仅当对于每对节点(u,v)时,树中这两个节点之间的最大流量与原始树中的最大流量相同图(这意味着最小切割的成本是相同的)。

2)树只满足切割属性当且仅当对于每对节点(u,v),此树中的最小切割与原始图形中的最小切割(不仅仅是成本是相同的,但两个子集也是相同的。)

所以问题是:什么是Gomory-Hu树?有两个常见的定义:
1)流量等效树 2)满足切割属性的流等效树。

即使没有记录该库中使用的定义,似乎他们使用了第一个。因此,只能保证切割成本相同,而不是切割本身。如果您需要查找剪切本身,可以使用maxflow方法获取固定的节点对。