Java 如何找到访问树中所有选定节点的最短路径?

Java 如何找到访问树中所有选定节点的最短路径?,java,c#,algorithm,Java,C#,Algorithm,我知道有很多类似的寻路问题,我对Dijkstra的算法有一个简单的了解。但我被困在这个问题上,我相信这不是那么直截了当的。让我先解释一下这是怎么回事: 我有一棵树,它代表一个探索过的路径图。如果我用Java/C#语法编写path节点类,它将如下所示。(注意:移动到另一个节点会有成本) 想象一棵这样的树: [root] Node A [north] Node B [north] Node F [east] Node G [north

我知道有很多类似的寻路问题,我对Dijkstra的算法有一个简单的了解。但我被困在这个问题上,我相信这不是那么直截了当的。让我先解释一下这是怎么回事:

我有一棵树,它代表一个探索过的路径图。如果我用Java/C#语法编写path节点类,它将如下所示。(注意:移动到另一个节点会有成本)

想象一棵这样的树:

[root] Node A
    [north] Node B
        [north] Node F
        [east]  Node G
            [north]  Node H
    [east]  Node C
        [east]  Node I
            [north] Node N
            [east]  Node O
        [south] Node J
    [south] Node D
        [south] Node K
            [east]  Node P
            [south] Node Q
    [west]  Node E
        [south] Node L
        [west]  Node M
如果我有一组必须访问的节点,例如节点B、D、H、J、M、O、p 我不一定从根A开始,假设我从一开始就在节点E,我想在某个节点结束,假设节点F

如何找到从节点E开始的最短连续路径,允许我以任何顺序访问上面列出的所有选定节点,并在节点F完成路径?

所谓最短,我指的是在节点之间移动时成本的最小总和

起初我认为这意味着将Dijkstra的算法应用于每个节点到节点的组合,但当我试图编码它时,我觉得我没有朝着正确的方向前进

我正在寻找代码或解释算法供参考


提前谢谢大家

请注意,在树上,从a到B只有一条合理的路径。从a到a和B的最低共同祖先,然后从那里到B。更一般地说,如果你有一棵树,其中包含你关心的节点集合,而子树中不包含这些节点,您知道,您所关心的节点之间的最佳路径都不会通过该子树

首先,我会删除树中所有你不必访问的叶子,然后删除由此创建的任何你不必访问的新叶子,依此类推,直到你有一棵树,它的叶子只是你必须访问的节点。如果该根目录只有一个子目录,请删除该根目录,依此类推,直到您有一个至少有两个子目录的根目录


现在从E到根,再从那里到F的路径开始。如果这访问了所有其他节点,那么您就完成了。否则,至少有一个子树的根位于包含您必须访问的其他节点的路径上。在路径中编辑一个巡更,该巡更离开路径对子树进行深度优先巡更,然后返回到路径。继续,直到您计算了所有未访问的节点。

到目前为止您尝试了什么?请看:@EJoshuaS他确实说过他试过Dijkstra的。这对我来说已经足够了。我认为海报主要是在寻找一个算法名称来进行研究,他们可能可以从那里着手。@Peter Duniho我认为树上的旅行推销员不是NP完全的,因为我认为最小旅行在离开它之前总是会旅行子树中的所有节点,我认为这意味着你可以通过树上的动态规划来解决它。这个问题要求在两个命名节点之间建立一条路径,这使得动态规划解决方案不那么优雅。我已经提供了一个相当特别的答案,我相信这会找到一个最佳的解决方案,尽管我没有提供这方面的证据。谢谢。这是一个非常明智的回答。比使用旅行推销员更有效率
[root] Node A
    [north] Node B
        [north] Node F
        [east]  Node G
            [north]  Node H
    [east]  Node C
        [east]  Node I
            [north] Node N
            [east]  Node O
        [south] Node J
    [south] Node D
        [south] Node K
            [east]  Node P
            [south] Node Q
    [west]  Node E
        [south] Node L
        [west]  Node M