我正在尝试使用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
但这不是最小砍树!如果树是这样的,那么删除1
和2
之间的边缘会产生图表分为两个子集{0, 1}
和{2, t}
的代价但是,正确的答案是削减{1}
和{2, 0, t}
,费用仅为140.
(“成本”是指各自削减的价值。)
因此,最小切割树的一个(也是唯一的)正确答案是
0--artificial, 1--artificial, 2--artificial
我出错了什么?在这种情况下使用gomory_hu_tree()
方法可能是错误的吗?
答案 0 :(得分:1)
以下是几个定义:
1)树被称为流等效树当且仅当对于每对节点(u,v)时,树中这两个节点之间的最大流量与原始树中的最大流量相同图(这意味着最小切割的成本是相同的)。
2)树只满足切割属性当且仅当对于每对节点(u,v),此树中的最小切割与原始图形中的最小切割(不仅仅是成本是相同的,但两个子集也是相同的。)
所以问题是:什么是Gomory-Hu树?有两个常见的定义:
1)流量等效树
2)满足切割属性的流等效树。
即使没有记录该库中使用的定义,似乎他们使用了第一个。因此,只能保证切割成本相同,而不是切割本身。如果您需要查找剪切本身,可以使用maxflow
方法获取固定的节点对。