如何通过用连接路径起点和终点的边缘代替每个最长的非分支路径来减少DAG?

时间:2019-01-04 05:33:26

标签: python networkx

我想通过用连接路径起点和终点的边代替每条最长的非分支路径来减少DAG。

例如,对于这样的图形,我想将其缩小

a->b->c->d
a->d

到以下。当然,真正的DAG可能比这更复杂。

a->d
a->d

我找不到使用networkx的方法。有人知道如何在网络中这样做吗?谢谢。

1 个答案:

答案 0 :(得分:1)

据我所知,Networkx不开箱即用。但是,实现起来并不太复杂。您可以简单地遍历图中的节点,然后执行以下步骤:

  1. 删除每个具有恰好一个入口边缘和一个出口边缘的节点。
  2. 使用新边缘将传入边缘的源节点连接到传出边缘的目标节点。

这似乎可行:

def should_remove_node(graph, node):
    return graph.in_degree(node) == 1 and graph.out_degree(node) == 1

for node in list(G.nodes()):
    if should_remove_node(G, node):
        in_node = list(G.in_edges(node))[0][0]
        out_node = list(G.out_edges(node))[0][1]
        G.add_edge(in_node, out_node)
        G.remove_node(node)