定向图找到其输入边缘不能从给定节点到达的节点

时间:2012-03-25 14:26:28

标签: algorithm directed-graph directed-acyclic-graphs

在最近的一次采访中,我被问到以下问题。

给定一组节点和边,其中起始节点指向最终端节点。在下图中,它从1结束处开始。他们的问题是以节点2(或任何节点)作为起点,我们如何在其路径中找到其输入边缘不能从节点2全部到达的下一个节点(即我们怎样才能达到14)。

我怎么能这样做,伪代码应该没问题。

enter image description here

4 个答案:

答案 0 :(得分:3)

  1. 标记从起始节点可到达的所有边。
  2. 找到可从具有未标记输入边的起始节点到达的第一个节点。

答案 1 :(得分:1)

我会说:

  1. 查找节点2无法访问的节点。运行BFS或任何完整算法以查找所有可访问的R集。使用U = V - R

  2. 查找无法访问的内容
  3. 查找从这些无法访问的节点可以到达的所有节点,无论何时找到节点,您都知道它是否在节点2的可访问列表中。如果是,则保存刚刚使用的边缘。

  4. 在第二步中,您连续选择U中的节点并执行BFS。您对节点的处理方式不同:

    • 每当您发现属于X的节点U已被选中时,您就会停止
    • 每当您发现某个节点Y属于U而未被挑选时,您就会从U
    • 中删除此节点
    • 当您在R中找到节点时,您会记住边缘并将此节点标记为“请勿访问”。

答案 2 :(得分:1)

我没有看到任何方法避免至少遍历整个图表一次(假设节点没有父母的链接)。如果可以,那么基于从节点到直接父母集合的地图的简单解决方案(下面的“父地图”)是:

  • 编写一个例程,为起始节点下的所有节点扩展父映射(使用dfs)。例程不需要探索已经是地图中键的节点。

  • 为图中的每个节点调用上面的例程。这给出了从节点到父节点的完整映射(有效地转换了图形)。

  • 使用新地图从问题中的给定节点(例如2)调用上述例程。这给出了从节点到父母可以从2到达的映射。

  • 使用给定节点的bfs,找到两个地图中父项不同的第一个节点。

您不需要在地图中存储实际的父节点(这最容易解释);你可以通过标记被访问的节点并存储父母数量的计数来做类似的事情。

还有另一种说法:找到图的转置和从给定节点可到达的节点集。然后来自给定节点的bfs找到转置通向可达集之外的父节点的第一个节点。(这真的只是问题...)

答案 3 :(得分:0)

  • 如果此算法必须进行一次查找,那么只需考虑StartNode:
    • 查找可从“开始节点”访问的所有节点。 (通过运行BFS图遍历算法)
    • 在哈希表中保留可从StartNode访问的节点列表,以便进行有效查找。
    • 对于可从当前节点访问的每个节点(按顺序):
      • 检查传入节点(开始传入边缘的椎骨)
      • 如果哈希表中的所有传入节点都可用,则移至下一个可达节点      - 否则返回此节点。