首页 > 解决方案 > 删除图网络中的循环

问题描述

我有一个如下图所示的 Networkx 图

在此处输入图像描述

该图像已使用以下代码创建

import networkx as nx
import matplotlib.pyplot as plt

G = nx.gnm_random_graph(n=20, m=30, seed=1)
nx.draw(G, with_labels=True)
plt.show()
G.add_edges_from([(2, 20), (20, 8)])
n = len(G.nodes())

retain_node_ids = [1,2]
G.add_edges_from([(u, v) for u in retain_node_ids for v in (n, n+1)])
G = nx.k_core(G, k=2)
G.remove_nodes_from([n, n+1])
nx.draw(G, with_labels=True)
plt.show()

这是一个流网络,我想删除像红色标记的循环。这是一个示例图;在真实的网络中有很多这样的循环,我想检测并删除这些循环中的所有边缘。

在此处输入图像描述

例如,流向是从 7 -> 8 并且没有出口,边 (7,8) 不是多边。

关于如何删除此类循环的建议将不胜感激。

编辑:为什么我要删除红框内的循环区域?这是因为图形是有向的。让我们考虑流向是从 7 到 8,这是一个运输网络,一旦货物流入 8,那么它可以从 8 -> 2 或 8-> 20 运输,但没有退出循环。

标签: python-3.xgraphnetworkx

解决方案


Tarjan 算法检测有向图中的循环,并报告在循环中捕获的节点。根据实施情况,您必须多次重新运行它,直到它变得干净。

https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm


推荐阅读