我之前从未使用过DFS,我想知道如果你要遍历以下"树":
,如何使用它来找到路径中最小的产品 3
4 5
7 6 4
3 5 7 8
1 2 3 4 4
请参阅以下评论以清除任何混淆(:
答案 0 :(得分:0)
您需要构建一个有向图,其中节点是数字,每个节点在下一级有一个数字/节点的2条边。此特定问题中的图表将是有向无环图。
然后,您只需在构建的图形上运行DFS。但是,您不会跟踪/检查您之前是否访问过某个节点,因为您想重新访问它们。相反,您只需要检查当前节点是否具有0 out-degree 或节点(因为底部的节点将具有0 out-degree ),并更新到达底部节点时的当前最小值。 (您也可以跟踪当前深度,并在达到深度时更新当前最小值)。我们可以针对这个特殊问题做到这一点,因为所有产品都是正好乘以5个数字的结果,每个数字一个。
我上面描述的是DFS的树搜索变体,与普通的图搜索变体相比,您可以跟踪之前是否访问过某个节点。当图中有一个循环时,树搜索DFS会卡住,但由于这是一个有向无环图,我们不会遇到这样的问题。
如果数字全部为非负,我们可以观察到:无论我们如何从根到达节点,前面的最佳路径每次都是相同的。
在这种情况下,从底部节点向后工作会更快。对于与同一“父”节点相邻的每对,选择较小的一对并乘以“父”节点。继续这样做,直到到达根节点,然后你就会得到结果。
如果数字可以正数或负数或0 ,则需要跟踪4个数字:绝对值最大和最小的负产品,最大和最小正产品。而且您还需要跟踪是否可以形成0产品。 2个最大绝对值是正x负的情况。 2个最小绝对值适用于正x正或负x负的情况。在算法开始时,所有这5个字段都是未定义的。
如何更新的详细信息留给读者。应按顺序检查结果:绝对值最大的负数,0,绝对值最小的正数。如果该字段未定义,则跳过它并检查下一个字段。