Algorithm 从每个节点高效地查找图的深度

Algorithm 从每个节点高效地查找图的深度,algorithm,graph,graph-algorithm,Algorithm,Graph,Graph Algorithm,我有一个问题,我要找到一个图的最小可能深度,这意味着我必须找到每个节点的最大深度,然后返回所有节点中最小的深度。显然,每个节点的一个简单DFS就可以做到这一点,但是当输入量非常大时,DFS就会变得效率低下(时间限制)。我试着保持每片叶子与内存中正在探索的节点之间的距离,但没有多大帮助 如何有效地找到一个非常大的图的最小深度。值得注意的是,所讨论的图形没有循环。要找到无向树图形的图形中心,您可以: 执行DFS以查找所有叶节点的列表O(n) 从图中删除所有这些叶节点,并在删除过程中注意哪些新节点成为

我有一个问题,我要找到一个图的最小可能深度,这意味着我必须找到每个节点的最大深度,然后返回所有节点中最小的深度。显然,每个节点的一个简单DFS就可以做到这一点,但是当输入量非常大时,DFS就会变得效率低下(时间限制)。我试着保持每片叶子与内存中正在探索的节点之间的距离,但没有多大帮助


如何有效地找到一个非常大的图的最小深度。值得注意的是,所讨论的图形没有循环。

要找到无向树图形的图形中心,您可以:

  • 执行DFS以查找所有叶节点的列表O(n)
  • 从图中删除所有这些叶节点,并在删除过程中注意哪些新节点成为叶节点
  • 重复步骤2,直到图形完全删除
  • 在算法的最后阶段删除的节点将是树的图形中心


    每个节点删除一次,因此整个过程可以在O(n)中完成。

    您似乎在寻找的是直径/2。对于树的任意节点
    n
    ,可以如下所示计算树的直径,并将其称为
    findDiameter(n,null)

    public findDiameter(node n, node from) returns <depth, diameter>
    
        // apply recursively on all children
        foreach child in (neighbors(n) minus from) do
            <de, di> = findDiameter(child, n)
    
        // depth of this node is 1 more than max depth of children
        depth = 1 + max(de)
    
        // max diameter either uses this node, then it is 1 + the 2 largest depths
        // or it does not use this node, then it's the max depth of the neighbors
        diameter = max(max(di), 1 + max(de) + oneButLargest(de))
    
    public findDiameter(节点n,节点from)返回
    //对所有子项递归应用
    (n)减去from)do中的每个子级
    =findDiameter(子项,n)
    //此节点的深度比子节点的最大深度大1
    深度=1+最大值(de)
    //“最大直径”使用此节点,则它是1+2个最大深度
    //或者它不使用这个节点,那么它就是邻居的最大深度
    直径=最大值(最大值(di),1+最大值(de)+一个最大值(de))
    

    你所需要做的就是在邻域上循环跟踪最大直径和2个最大深度。

    你是在试图找到无向树图的最大直径吗?@peterderiaz是的,类似于我读到的“图的直径”的定义,我怀疑这是否解决了我的问题。你能解释一下这和我的问题有什么关系吗。谢谢。@OlayinkaSF树的直径
    d
    是两片叶子之间最长路径的长度。在该路径中考虑中间节点<代码> m <代码>(假设代码> d<代码>为偶数;如果<代码> d <代码>为奇数,则有2个这样的节点。距离
    m
    的最大深度为
    d/2
    (其最大深度必须沿最长路径找到,否则我们会产生矛盾,其他路径会更长)。对于每个其他节点,最大深度至少为
    d/2+1
    (通过
    m
    布线,然后到达最长路径的一端)。因此,
    m
    是一个图形中心,您搜索的值是
    d/2
    。我可以确认这是一个有效的解决方案。然而,要找到深度,不必计算直径。请注意,这只适用于具有一个连接组件的图。迭代次数将是返回值?对吗?如果在最后一个阶段删除了多个节点,那么答案将是迭代次数。但是,如果在最后一个阶段删除了一个节点,那么答案将是迭代次数-1。(树A-B将在1次迭代中删除,深度为1,而树A也将在1次迭代中删除,haa深度为0)我是否遗漏了什么,或者要删除的最后一个节点始终是DFS的键?@tumasgiu不太确定DFS的键是什么意思?也许你指的是DFS的起点?如果是这样,那么请注意,您可能已经从叶节点启动了DFS,因此起点可能是第一个要删除的节点之一。是的,我指的是DFS起点。但在无向图中,没有叶节点的概念,对吗?我以为你提到的叶子是DFS“创造”的