在最近的一次采访中,我被问到以下问题。
给定一组节点和边,其中起始节点指向最终端节点。在下图中,它从1结束处开始。他们的问题是以节点2(或任何节点)作为起点,我们如何在其路径中找到其输入边缘不能从节点2全部到达的下一个节点(即我们怎样才能达到14)。
我怎么能这样做,伪代码应该没问题。
答案 0 :(得分:3)
答案 1 :(得分:1)
我会说:
查找节点2无法访问的节点。运行BFS或任何完整算法以查找所有可访问的R
集。使用U = V - R
查找从这些无法访问的节点可以到达的所有节点,无论何时找到节点,您都知道它是否在节点2的可访问列表中。如果是,则保存刚刚使用的边缘。
在第二步中,您连续选择U
中的节点并执行BFS。您对节点的处理方式不同:
X
的节点U
已被选中时,您就会停止Y
属于U
而未被挑选时,您就会从U
R
中找到节点时,您会记住边缘并将此节点标记为“请勿访问”。答案 2 :(得分:1)
我没有看到任何方法避免至少遍历整个图表一次(假设节点没有父母的链接)。如果可以,那么基于从节点到直接父母集合的地图的简单解决方案(下面的“父地图”)是:
编写一个例程,为起始节点下的所有节点扩展父映射(使用dfs)。例程不需要探索已经是地图中键的节点。
为图中的每个节点调用上面的例程。这给出了从节点到父节点的完整映射(有效地转换了图形)。
使用新地图从问题中的给定节点(例如2)调用上述例程。这给出了从节点到父母可以从2到达的映射。
使用给定节点的bfs,找到两个地图中父项不同的第一个节点。
您不需要在地图中存储实际的父节点(这最容易解释);你可以通过标记被访问的节点并存储父母数量的计数来做类似的事情。
还有另一种说法:找到图的转置和从给定节点可到达的节点集。然后来自给定节点的bfs找到转置通向可达集之外的父节点的第一个节点。(这真的只是问题...)
答案 3 :(得分:0)