当前位置: 首页 > 面试题库 >

如何为非循环有向图的顶点分配“级别”?

白博易
2023-03-14
问题内容

我有一个非循环有向图。我想为每个顶点分配级别,以确保如果边(v1,v2)在图中,则level(v1)>
level(v2)。每当(v1,v2)和(v3,v2)在图中时,如果level(v1)=
level(v3),我也希望它。同样,可能的级别是离散的(也可以将它们作为自然数)。理想的情况是,每当(v1,v2)在图中并且没有从v1到v2的其他路径时,level(v1)=
level(v2)+1,但是有时在其他约束条件下是不可能的-例如,考虑在五个顶点上有(a,b)(b,d)(d,e)(a,c)(c,e)的图。
有谁知道解决这个问题的体面算法?我的图很小(| V | <= 25左右),所以我不需要快速进行操作-简单性更为重要。

到目前为止,我的想法是只找到一个最小元素,将其分配为0级,找到所有父级,将它们分配为1级,并通过在适当的顶点上添加+0.5来解决矛盾,但这似乎很糟糕。

另外,我觉得删除所有“隐式”边缘可能会有所帮助(即,如果图形同时包含(v1,v2)和(v2,v3),则删除(v1,v3)。


问题答案:

我认为将v的水平设为v的最长有向路径的长度可能对您来说很好。在Python中:

# the level of v is the length of the longest directed path from v
def assignlevel(graph, v, level):
    if v not in level:
        if v not in graph or not graph[v]:
            level[v] = 0
        else:
            level[v] = max(assignlevel(graph, w, level) + 1 for w in graph[v])
    return level[v]

g = {'a': ['b', 'c'], 'b': ['d'], 'd': ['e'], 'c': ['e']}
l = {}
for v in g:
    assignlevel(g, v, l)
print l

输出:

{'a': 3, 'c': 1, 'b': 2, 'e': 0, 'd': 1}


 类似资料:
  • 我目前正在研究一个在有向图中寻找由选定节点组成的圈的问题。 对于这里描述的实例: 在节点1,2,3内有一个循环,在1,2,4内没有发现循环。我已经尝试用下面的操作来实现算法: null 但是,这个实现并不适用来自我正在使用的在线判断的所有测试数据。我发现我的算法不同于深度优先搜索,深度优先搜索使用白、灰、黑数组来存储未访问、正在访问或不需要访问的节点,我想知道这是否是导致问题的原因。 希望在您的帮

  • 一个简单的背景:我正在构建一个语义图,使用带有邻接表的BGL有向图: 我需要做的事情之一,是处理一个较小的图(子图)到我的主图。 暗示我的lambda捕获参数应该是一对(我猜是一个实际的边?)。 所以,我的问题是:我怎样才能发现在顶点的外边中是否存在类似的边呢?

  • 所以我正在研究这个问题: 这是我目前所掌握的 首先,我想对我的答案再作核实。我对有向图不是那么熟悉,对算法的效率/复杂度也不是特别熟练。我想我做得对,但如果我需要的话,我想要一些帮助。我也在寻找任何想法,使它更有效率。这些是我脑海中最先出现的算法,所以我觉得可能有更好的方法来实现它。 谢谢

  • 我在这里读到一篇关于在有向图中求圈的讨论。现在,OP声称我们需要验证两件事: 从到有一个后沿 在递归堆栈中 为什么我们需要第二次测试?你能举个例子来说明它的必要性吗?

  • 给出了一个连通的加权图,它的权值是非负的。我想把它转换成一个连通的无环图,这样删除的边的权重之和最小化。输出将是移除的边缘。 我的想法:由于连通无环图是一棵树,所以我可以简单地取最大边,去掉所有其他边。但是,这可能并不总是正确的。它可能导致一个断开的图。

  • 我们可以用这里所述的算法求有向图中的圈数。我需要理解算法。 (1)最后那句话到底有什么用处?对algo的工作原理进行简短的描述会很有帮助。由于算法基本上是统计从一个节点返回到同一节点的周期数,所以我们可以使用另一个数组,称之为v,并做以下技巧: (2)我不能实现我刚才写的算法。这是主要的问题,但我认为我需要理解上面的(1)来理解打印所有循环的代码。 我了解到互联网上有算法,我正在尝试使用这个算法。