Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NetworkX查找有向图中特定节点的根节点_Python_Graph Theory_Networkx - Fatal编程技术网

Python NetworkX查找有向图中特定节点的根节点

Python NetworkX查找有向图中特定节点的根节点,python,graph-theory,networkx,Python,Graph Theory,Networkx,假设我在网络X中有一个有向图G,这样: G中有多棵树 G中的每个节点N正好有1或0 父母的 对于一个特定的节点N1,我想找到它所在的树的根节点(其度为0的祖先)。在NetworkX中有没有一种简单的方法可以做到这一点 我看了看: 但在我的图中有多个根节点。只有一个根节点恰好与N1位于同一个树中。编辑2017年11月。请注意,这是在networkx 2.0发布之前编写的。有一种方法可以将1.x代码更新为2.0代码(特别是使其与两者兼容) 这里有一个简单的递归算法。它假定最多有一个单亲。如果某个对

假设我在网络X中有一个有向图G,这样:

  • G中有多棵树
  • G中的每个节点N正好有1或0 父母的
  • 对于一个特定的节点N1,我想找到它所在的树的根节点(其度为0的祖先)。在NetworkX中有没有一种简单的方法可以做到这一点

    我看了看:
    但在我的图中有多个根节点。只有一个根节点恰好与N1位于同一个树中。

    编辑2017年11月。请注意,这是在networkx 2.0发布之前编写的。有一种方法可以将1.x代码更新为2.0代码(特别是使其与两者兼容)


    这里有一个简单的递归算法。它假定最多有一个单亲。如果某个对象没有父对象,那么它就是根对象。否则,它将返回其父级的根

    def find_root(G,node):
        if G.predecessors(node):  #True if there is a predecessor, False otherwise
            root = find_root(G,G.predecessors(node)[0])
        else:
            root = node
        return root
    

    如果该图是一个有向无环图,它仍然会找到一个根,尽管它可能不是唯一的根,甚至不是给定节点的唯一根祖先。

    我冒昧地更新了@Joel的脚本。他原来的职位不适合我

    def find_root(G,child):
        parent = list(G.predecessors(child))
        if len(parent) == 0:
            print(f"found root: {child}")
            return child
        else:  
            return find_root(G, parent[0])
    
    这里有一个测试:

    G = nx.DiGraph(data = [('glu', 'skin'), ('glu', 'bmi'), ('glu', 'bp'), ('glu', 'age'), ('npreg', 'glu')])
    test = find_root(G, "age")
    age
    glu
    npreg
    found root: npreg
    

    你有没有想过只看它的父母,然后是父母的父母等等,直到它停止i、 例如,对边缘进行深度优先搜索(或广度优先搜索或任何其他搜索),直到停止?最后一个节点必须是它。