【问题标题】:Which algorithm do I need for this directed graph operation?这个有向图操作需要哪种算法?
【发布时间】:2018-08-25 09:40:43
【问题描述】:

我可能想多了,遗漏了一些明显的东西,但我想知道我可以使用哪种 NetworkX 算法来实现以下目标:

给定一个有向图,例如:

以及节点列表如:Q1、Q2

找到所有连接到 Q1 和 Q2 的节点(或者换句话说,它们的子节点),结果如下:

哪种算法可以做到这一点?

【问题讨论】:

    标签: networkx graph-theory digraphs


    【解决方案1】:

    看起来你只需要对networkx.Digraph.predecessors进行递归

    【讨论】:

      【解决方案2】:

      第一种方法是使用列表,从您的节点开始访问每个节点的前任并将其放入列表中,以这种方式与您找到的节点一起构建一棵树。

      另一种方法是在反转边的图上使用访问(DFS 或 BFS)。

      考虑以下示例,我从节点“Q1”开始构建bfs tree

      import networkx as nx
      
      g = nx.DiGraph()
      
      g.add_edges_from([("M1","Q1"),("I1","M1"),("I2","M1"),("I3","M1"),("I3","M2"),("M2","Q2")])
      
      #creating a graph with the edges reversed
      g2 = nx.DiGraph()
      g2.add_edges_from([(v,u) for (u,v) in g.edges()])
      
      t = nx.bfs_tree(g2, "Q1")
      
      for (u,v) in t.edges():
          t.remove_edge(u,v)
          t.add_edge(v,u)
      
      
      print(t.nodes(),t.edges())
      # ['Q1', 'M1', 'I1', 'I2', 'I3'] [('M1', 'Q1'), ('I1', 'M1'), ('I2', 'M1'), ('I3', 'M1')]
      

      【讨论】:

        猜你喜欢
        • 2011-03-29
        • 2012-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多