【问题标题】:Lowest Common Ancestor in a Directed Graph in igraph?igraph中的有向图中的最低共同祖先?
【发布时间】:2021-10-20 17:18:56
【问题描述】:

igraph 是否有一种算法可以输出有向图中 2 个节点的最低共同祖先?这不是 DAG,它可能有循环。

如果没有,我可以使用 igraph 来确定 LCA 吗?

这是一个示例图:

m <- read.table(row.names=1, header=TRUE, text=
                  " A B C D E F G H
                A 0  1  1  0  0 0 0 0
                B 0  0 0  1  1 0 0 0
                C 0 0  0  1 0 0 0 0
                D 0  0  0  0 0 1 0 0
                E 0  0 1 0  0 0 0 0
                F 0  0  0  0  1 0 0 0
                G 0  0  0  1  0 0 0 1
                H 0  0  0  0  0 1 1 0")
m <- as.matrix(m)
ig <- graph.adjacency(m, mode="directed")
plot(ig)

  • 如果我要问,节点“E”和“C”共享的最近父节点是什么?答案是“A”或“B”或“F”。

  • 节点“G”和“C”共享的最近的父节点呢?答案是“H”。

  • 由于我们正在寻找父节点,因此节点不能是它自己的父节点,因此节点“H”和“C”共享的最近父节点将是“G”。

  • 最后,节点“A”和“G”共享的最近父节点将是“无”。

附:我不确定在关系的情况下是否有规则。就像节点与父节点的距离分别为 (1,3) 和与另一个父节点的距离为 (2,2)。

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。
  • these 中的任何一个都适用于循环吗?
  • @user20650 是的,完全正确。这些图之一,但有循环,所以它们不是树。我需要尝试从头开始制作带有循环的有向图,以提供可重现的示例。我想知道igraph中有没有默认的
  • 如果是循环,那么预期的结果是什么?您能否展示一个包含数据和所需输出的示例?
  • 为什么BEC 的LCA?如果算上B,那么F也应该没问题。

标签: r graph-theory igraph directed-graph graph-traversal


【解决方案1】:

如果您的图包含环,则您无法推断其顶点的拓扑顺序。
如果没有顶点顺序,您无法定义“最低”,因此您无法定义“最低共同祖先”是什么。
因此,除非您想出“最低共同祖先”的替代定义,否则问题无法解决,因为它无法表征。

【讨论】:

  • 您好,感谢您的澄清。我希望我在问题中添加了更多细节,以便可以描述问题。
  • 恐怕你需要提出一个更严格的定义。例如,您可以尝试最小化从祖先到目标节点的距离的总和(或乘积,或...)。在任何情况下,都可能存在关系,就像 DAG 中可能存在关系一样。因此,您将寻找 a LCA,而不是 LCA。
【解决方案2】:

我猜你可以像下面这样定义一个自定义函数

f <- function(g, vs) {
  da <- subset(colSums(distances(g, mode = "in")[vs, ]), !names(V(g)) %in% vs)
  if (all(is.infinite(da))) {
    return("None")
  }
  names(which(da == min(da)))
}

然后

> f(ig, c("E", "C"))
[1] "A" "B" "F"

> f(ig, c("G", "C"))
[1] "H"

> f(ig, c("H", "C"))
[1] "G"

> f(ig, c("A", "G"))
[1] "None"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多