[英]How to delete all related nodes in a directed graph using networkx?
我不確定我的問題的正確術語是什么,所以我只是解釋我想做什么。 我有一個有向圖,在我刪除一個節點后,我想要刪除所有獨立相關的節點。
這是一個例子:
比如說,我刪除節點'11',我也希望刪除節點'2'(在我自己的例子中,它們將是2以下的節點,現在也必須被刪除)因為它沒有連接到主圖了。 注意,不應刪除節點“9”或“10”,因為節點“8”和“3”仍然連接到它們。
我正在使用python庫networkx。 我搜索了文檔,但我不確定術語,所以我不確定這是什么。 如果可能的話,我想使用庫提供的函數,而不是通過圖形創建我自己的遞歸(因為我的圖非常大)。
任何有關如何做到這一點的幫助或建議都會很棒。
謝謝!
我假設以下是真的:
如果是這種情況,那么給定初始設置,節點在圖中的唯一原因是
因此,每次從圖中刪除節點時,可能需要刪除的唯一節點就是該節點的后代。 如果您刪除的節點位於根集中,則可能需要修剪大量圖形,如果刪除的節點是后代節點,其后代很少,那么您可能需要做很少的事情。
在給定此設置的情況下,一旦刪除了某個節點,您將需要掃描該節點的所有子節點,以查看它們中是否有其他父節點將其保留在圖形中。 由於我們假設圖中的唯一節點是需要存在的節點,如果已刪除節點的子節點至少有一個其他父節點,則它應該仍然在圖中。 否則,需要刪除該節點。 因此,執行刪除步驟的一種方法是以下遞歸算法:
但是,這可能不是直接實現的好算法,因為如果你有一個大圖,所涉及的遞歸可能會變得非常深。 因此,您可能希望使用像這樣的工作列表算法來實現它:
這最終是最壞情況下的O(m)時間,其中m是圖中邊緣的數量,因為理論上每個邊緣都必須被掃描。 但是,假設您的圖表中有一些冗余,它可能會快得多。
希望這可以幫助!
讓我為您提供解決任務的python networkX代碼:
import networkx as nx
import matplotlib.pyplot as plt#for the purpose of drawing the graphs
DG=nx.DiGraph()
DG.add_edges_from([(3,8),(3,10),(5,11),(7,11),(7,8),(11,2),(11,9),(11,10),(8,9)])
DG.remove_node(11)
connected_components方法令人驚訝地無法在有向圖上工作,因此我們將圖形轉向無向,找出未連接的節點,然后從有向圖中刪除它們
UG=DG.to_undirected()
not_connected_nodes=[]
for component in nx.connected_components(UG):
if len(component)==1:#if it's not connected, there's only one node inside
not_connected_nodes.append(component[0])
for node in not_connected_nodes:
DG.remove_node(node)#delete non-connected nodes
如果要查看結果,請在腳本中添加以下兩行:
nx.draw(DG)
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.