Python 考虑边缘重量的最小s-t边缘切割

Python 考虑边缘重量的最小s-t边缘切割,python,graph-algorithm,networkx,Python,Graph Algorithm,Networkx,我想使用Networkx计算图中两个节点之间的最小边切割,同时考虑边权重。我尝试了和函数,但它们给出的结果相同,因为它们只考虑了边的数量。我生成了一个简单的图来解决这个问题(我试图找到节点0和4之间的最小边切割),如下所示: G = nx.Graph() G.add_nodes_from([0,1,2,3,4]) G.add_edges_from([(0,1),(0,2),(1,3),(3,4),(2,3)], weight = 1) G[3][4]['weight']=3 G[0][1]['w

我想使用Networkx计算图中两个节点之间的最小边切割,同时考虑边权重。我尝试了和函数,但它们给出的结果相同,因为它们只考虑了边的数量。我生成了一个简单的图来解决这个问题(我试图找到节点0和4之间的最小边切割),如下所示:

G = nx.Graph()
G.add_nodes_from([0,1,2,3,4])
G.add_edges_from([(0,1),(0,2),(1,3),(3,4),(2,3)], weight = 1)
G[3][4]['weight']=3
G[0][1]['weight']=2
G[2][3]['weight']=2
print minimum_st_edge_cut(G, 0, 4)
print nx.minimum_edge_cut(G,0,4)
node_pos=nx.spring_layout(G)
nx.draw_networkx(G,node_pos,with_labels = True)
edge_labels = dict (( (i,j),G[i][j]['weight']) for (i,j) in G.edges())
nx.draw_networkx_edge_labels(G, node_pos, edge_labels=edge_labels)
plt.show()
这两个函数的输出都是
[(3,4)]
,其总边缘权重为3。如果考虑了权重,则输出边应为
[(0,2)、(1,3)]
,总边权重为2


我不确定Networkx是否提供了这样的功能,但如果没有,用最简单的方法计算就可以解决问题。

似乎可以使用使用最小切割最大流量定理的来完成,并且可以指定边的容量以考虑权重。它返回剪切权重以及2组节点(一组用于剪切创建的每个分区)。然后,可以通过两个嵌套循环来查找通过切割的边,其中存储了两组节点之间的边。下面是我用来为问题中给出的示例实现解决方案的代码部分:

cut_weight, partitions = nx.minimum_cut(G, 0, 4, capacity='weight')
edge_cut_list = []
for p1_node in partitions[0]:
    for p2_node in partitions[1]:
        if G.has_edge(p1_node,p2_node):
            edge_cut_list.append((p1_node,p2_node))
其中(通过打印):


这是预期的输出。

对于最初误读您的目标表示歉意。我会再考虑一下的。@joel检查我写的答案,这是我的想法,但如果你有任何意见,我们将不胜感激。甚至是我第一次回答自己的问题。
cut_weight = 2
partitions[0] = set([0, 1])
partitions[1] = set([2, 3, 4])
edge_cut_list = [(0, 2), (1, 3)]